Текстовый файл Unicode/ UTF-8: бред на консоли Windows (пытается отобразить иврит)
У меня есть файл широких символов (с текстом на иврите), который отлично смотрится в блокноте (сохранен в "кодировке UTF-8"), отлично читается в Notepad++, а когда я копирую и вставляю в MS Word, он тоже отлично выглядит. Но когда я открываю "DOS box" (консоль Windows) и захожу: "type file.txt", он печатает бред.
И да, я выполнил все рекомендации для Unicode на консоли Windows: я открыл консоль с помощью "cmd /u", изменил шрифт на Lucida и ввел: "chcp 65001".
Проблема идентична на ПК под управлением Windows 7 и на другом ПК под управлением Windows XP SP3.
5 ответов
Шрифт Courier New
поддерживает иврит и может быть добавлен в командную строку. Шрифтами по умолчанию являются consolas, lucida, raster, но ни один из них не поддерживает иврит. Поэтому добавьте Courier New в командную строку.
Это взломать реестр, чтобы сделать это
http://www.techrepublic.com/blog/windows-and-office/quick-tip-add-fonts-to-the-command-prompt/
Это хороший пример того, как установить шрифты, но я должен удалить многие из этих записей, потому что большинство из них не было добавлено в cmd, потому что cmd их не поддерживает.
Люцида и Консолас по умолчанию.
Растр по умолчанию не указан здесь, может быть, потому что это TTF
Из всех этих я пытался добавить только 3 (поддерживаются cmd)
Курьер Нью, ДежаВу Санс Моно, Дроид Санс Моно
DejaVu Sans Mono и Droid Sans Mono доступны для загрузки, поддерживаются cmd, могут иметь хорошую поддержку символов / юникода, но не включают иврит
я имею
Consolas <-- default
Courier New <--- added
DejaVu Sans Mono <-- added
Droid Sans Mono <-- added
Lucida Console <-- default
Raster Fonts <-- default
Обычными шрифтами на иврите являются Мириам и Дэвид, но их нельзя добавить в командную строку.
Для записи, Babelmap может перечислить все шрифты в вашей системе, которые поддерживают иврит, например, в babelmap - щелкнуть шрифты... покрытие шрифтов, затем ввести 05D0(это алеф). Я думаю, что все эти шрифты существуют при установке Windows 7 по умолчанию
Aharoni, Arial, Courier New, David, FrankRuehl, Gisha, Levenim MT, Lucida Sans Unicode, Microsoft Sans Serif, Miriam, Miriam Fixed, Narkisim, Rod, Segoe WP, Tahoma, Times New Roman
Но большинство или все эти шрифты с ивритом не поддерживаются в командной строке, кроме Courier New. Фактически, полная остановка большинства шрифтов не поддерживается в командной строке, даже "раз новый римский"(потому что "раз новый римский" не имеет одинарную / фиксированную ширину, и это один из нескольких критериев, по которым он должен быть поддерживается, другие критерии кажутся более неясными).
Так что теперь вы можете добавить Courier New и выбрать его для использования в командной строке.
И поэтому вы можете вставлять символы юникода в cmd, если выбранный шрифт поддерживает это.
Чтобы скопировать / вставить, нажмите кнопку "Копировать" на карте
Теперь это в буфере обмена
Чтобы вставить его в командную строку, в win7 вставьте в командную строку не Ctrl-V. Вы щелкаете правой кнопкой мыши и выбираете вставить. (или если в режиме быстрого редактирования, то просто щелкните правой кнопкой мыши)
Это главное.
Дополнительно
Часто в окнах можно использовать блокнот и карту символов... но следует помнить о некоторых ограничениях с ними.
Карта символов показывает первые 65536 символов Юникода, когда выбранный вами шрифт поддерживает его, а карта символов показывает код UTF-16. Это нормально, вы все равно можете вставить карту символов в окно cmd.exe, но вы должны знать, что команды запускаются в cmd.exe, а каналы не поддерживают utf-16. Таким образом, вы можете использовать карту символов, найти символ, например, aleph 05d0, но стоит поискать символ на http://www.fileformat.info/info/unicode/char/05d0/index.htm и увидеть его, пока utf- 16 код - 05d0, код utf-8 - d790. Команда xxd и команда file полезны для просмотра реального содержимого файла и определения типа файла.
Блокнот немного ограничен, когда дело доходит до юникода или любого символа в наборе символов юникода, чей код UTF16> FF. И cmd немного ограничен в отношении некоторых команд, таких как "тип", а также в отношении каналов и перенаправления.
Если вы используете cmd.exe, вам действительно нужны каналы, потому что они важны..
Трубы ограничены кодировками, которые могут быть определены Командой CHCP.
(Обратите внимание, что если CHCP сообщает, что вы находитесь на определенной кодовой странице, например, 850, она сообщает вам кодировку ввода. Если вы запустите команду chcp 850, она изменит обе кодировки ввода и вывода. Обычно они одинаковы. Это проще, когда они одинаковы. Но если вы использовали какую-то другую программу для изменения кодировки cmd, например, компилятор C# имеет переключатель, который изменяет его, тогда лучше изменить его с помощью chcp, чтобы вы знали, что обе кодировки установлены).
Существует CHCP 1200 (UTF-16LE) и 1201(UTF-16BE), но ни один из них не поддерживается, если вы попробуете это, он скажет недопустимую кодовую страницу (протестировано в win7). CHCP не поддерживает UTF-16(он не поддерживает UTF16LE или UTF16BE). Есть CHCP 65001 (это UTF-8 без спецификации). И есть CHCP 862 (по старинке, как в MSDOS, кодирование иврита, о котором я упоминал)
Команда type поддерживает UTF16LE, как и блокнот (то, что блокнот называет Unicode, это UTF-16 LE), но каналы и перенаправление не поддерживают это. Команда type также поддерживает любую кодовую страницу, указанную / поддерживаемую CHCP. Так типа поддерживает 862 или 65001.
Таким образом, вы можете использовать блокнот сохранить его как UTF8 (который с спецификации), а затем возиться, чтобы удалить спецификацию. (Это немного излишне). Или вы можете использовать блокнот, сохранить его как Unicode UTF 16LE... Но тогда вы не можете подавать в суд на каналы... (это плохо).. Самое простое, что можно сделать, это использовать текстовый редактор, такой как notepad2 или notepad++, поддерживающий UTF8 без спецификации.
Или, если вы делаете все из cmd, вы можете использовать 862 или 65001. Хотя многие текстовые редакторы могут не обеспечить хорошую поддержку 862. Поэтому вы можете предпочесть 65001.
Если вы хотите записать какой-либо файл в блокнот, и его символ больше, чем в UTF16, называется \uFF, и вы хотите запускать команды в cmd.exe для этого файла, то некоторые команды (например, команда type), будут проблемы, если не принимать во внимание то, что поддерживается чем.
Блокнот поддерживает UTF-16BE, UTF-16LE и UTF-8 с спецификацией. Это не хорошо. И нет необходимости возиться с xxd и sed или другими командами для удаления спецификации. Если у вас есть какой-либо файл с так называемым юникодным символом, символ находится за пределами обычного диапазона ascii. Символ> UTF-16 \uFF, как показано на карте символов как> \uFF, затем используйте Notepad2 или notepad ++
Тип поддерживает UTF16LE и любую кодовую страницу, установленную CHCP, например, 65001 или 862.
Трубы и перенаправление идут в соответствии с тем, что установлено CHCP.
Кодовая страница 862 устарела, так что кодовая страница 65001 - хороший путь.
xxd и file полезны для просмотра того, как кодируется файл, что может быть полезно в случае возникновения проблем. Но не абсолютно необходимо.
Поэтому, если вы хотите написать файл для использования в CMD, и в нем есть несколько символов Юникода, в то время как есть некоторые команды, такие как xxd и sed, которые можно использовать для удаления спецификации, и другие команды для этого. Самый простой способ создать такой файл в текстовом редакторе - это использовать текстовый редактор, такой как notepad2 или notepad++, который поддерживает UTF8 без спецификации.
Получение отображения на иврите может быть самым важным, что нужно сделать в первую очередь, как описано выше. И следующая вещь - это возможность сохранять файлы в текстовом редакторе, который вы можете отобразить, например, с помощью "type".
И если вы когда-нибудь захотите скопировать из командной строки, если не в режиме быстрого редактирования, щелкните правой кнопкой мыши, затем выберите метку, затем выберите ее и нажмите клавишу ВВОД. И чтобы вставить правой кнопкой мыши и выберите вставить.
Еще одним дополнительным пунктом является
По-видимому, в chcp 65001 есть ошибки, из-за которых некоторые командные файлы не запускались, и, возможно, некоторые C-программы тоже не будут работать. Как использовать символы Юникода в командной строке Windows? И я даже видел сбой компилятора c sharp, когда cmd находится в кодовой странице 65001 (хотя можно обвинить компилятор c sharp, можно также обвинить 65001) Почему происходит сбой csc.exe, когда я в последний раз оставил выходную кодировку как UTF8?
Примечание. Более ранняя версия этого ответа содержала несколько примеров командной строки, но они были излишне сложными. В какой-то момент я мог бы добавить некоторые команды, которые демонстрируют то, что я описывал, но это довольно тривиально.
/u
предназначен для UTF-16LE, а не UTF-8. Вот почему файл сохраняется как UTF-16LE (что Windows/Notepad ошибочно называет "Юникод") и работает с /u
работает так же, как и он.
UTF-8 должен быть достижим с chcp 65001
, но есть некоторые неприятные ошибки низкого уровня в Microsoft C Runtime для этой кодовой страницы, что делает некоторые приложения ненадежными, а некоторые вообще не запускаются.
Так что да, извините, но UTF-8 - гражданка второго сорта под Windows. Все, что использует интерфейсы "ANSI" для ввода-вывода, включая все, что использует стандартную библиотеку ввода-вывода C, включая командную строку, не сможет справиться с этим должным образом.
Единственный надежный способ получить вывод Unicode в командной строке - это использовать Windows-специфичный WriteConsoleW
интерфейс для непосредственного ввода строк Unicode. К сожалению, поскольку это не доступно кроссплатформенно, многие инструменты не будут его использовать.
В любом случае, даже если у вас правильная кодировка, вам все равно нужно иметь в командной строке шрифт, содержащий нужные символы. Я считаю, что именно поэтому вы все еще не получаете иврит в /u
+ Маршрут UTF-16LE.
Резюме: Командная строка + не-ASCII == почти наверняка ошибка. Откажитесь и найдите какой-то другой интерфейс, который вы можете использовать, который лучше поддерживает Unicode.
Я предполагаю, что вы имеете в виду "Lucida Console", когда говорите "Lucida".
С использованием charmap
Приложение Я не смог найти ивритских символов в шрифте. Я не знаю, был ли шрифт более эффективным в более ранних версиях Windows, но в Windows 7, похоже, нет ничего, кроме европейских символов.
В моей системе также есть пишущая машинка Lucida Sans, которая включает в себя ивритские символы. К сожалению, окно Cmd не показывает это как выбор. Вам нужно отредактировать реестр, чтобы открыть больше вариантов, как показано в этом вопросе для SuperUser: https://superuser.com/questions/5035/how-to-change-the-windows-console-font
PS Я не смог проверить это решение, потому что Windows сложна. См. https://superuser.com/questions/390933/how-to-add-a-font-to-the-cmd-window-choices-in-windows-7-64-bit
Вы должны конвертировать file.txt
до UTF-16(Little Endian) до type file.txt
Справка: какую кодировку / кодовую страницу использует cmd.exe?
Как получить установку XP на иврите?
Прежде всего, речь идет о XP Home SP3 с включенным ивритом. Под этим я подразумеваю стандартную установку XP в США, или, как я полагаю, с добавлением возможностей иврита для клавиатуры и дисплея. Я полагаю, что каждый компакт-диск XP может установить такую систему. В частности, я считаю, что для такой системы необходимо следующее:
- Панель управления -> Дата, время, языковые и региональные параметры -> Языковые и региональные параметры -> на вкладке "Язык": 1) Нажмите "Подробности" и добавьте клавиатуру на иврите. 2) пометьте V установочными файлами для сложных сценариев и языков с написанием справа налево (включая тайский).
- Панель управления -> Дата, время, языковые и региональные параметры -> Языковые и региональные параметры -> на вкладке "Дополнительно": Принять, пометьте буквами V, 10004 (MAC - арабский) и 10005 (Mac - иврит). Не уверен, что арабский язык должен быть здесь.
Теперь к консоли CMD
Необходимо явно добавить шрифты Courier New в реестр консольных шрифтов, как описано ранее. В противном случае явные ивритские шрифты не будут отображаться.
Теперь, когда консоль cmd открыта, все, что нужно сделать для ввода символов иврита, - это включить шрифты Courier New и перевести клавиатуру в режим иврита. Windows прокручивает языки на клавиатуре легко. Либо повторное нажатие левой клавиши Alt в сочетании с левыми клавишами Shift, либо с помощью мыши.
Кроме того, команда dir покажет имена файлов, которые имеют ивритские символы. Тем не менее, нельзя просто выпустить
dir file_name
и посмотрите обычный вывод, если файл начинается с буквы на иврите. Это должно быть
dir *file_name
Я предполагаю, что символ звездочки добавляет символ юникода спецификации.
Можно также открыть Блокнот, ввести ивритские символы, сохранить файл как UTF8 и выполнить следующие команды консоли:
chcp 65001
type that_Notepad_file_I_saved
Сохранение файла в формате UTF8 выполняется на экране сохранения в блокноте.