Текстовый файл Unicode / UTF-8: бред на консоли Windows (пытается отобразить иврит) - PullRequest
10 голосов
/ 17 февраля 2012

У меня есть файл широких символов (с текстом на иврите), который отлично выглядит в блокноте (сохранен в «кодировке UTF-8»), отлично читает в Notepad ++, а когда я копирую и вставляю в MS Word, он выглядит нормальнотоже.Но когда я открываю «DOS box» (консоль Windows) и захожу: «type file.txt», он печатает бред.
И да, я выполнил все рекомендации для Unicode на консоли Windows: я открыл консольиспользуя «cmd / u», я изменил шрифт на Lucida и ввел: «chcp 65001».

Проблема идентична на ПК под управлением Windows 7 и на другом ПК под управлением Windows XP SP3.

Ответы [ 5 ]

10 голосов
/ 04 августа 2015

Шрифт Courier New поддерживает иврит и может быть добавлен в командную строку.Шрифтами по умолчанию являются consolas, lucida, raster, но ни один из них не поддерживает иврит.Поэтому добавьте Courier New в командную строку.

Это взломать реестр

http://www.howtogeek.com/howto/windows-vista/stupid-geek-tricks-enable-more-fonts-for-the-windows-command-prompt/

http://www.techrepublic.com/blog/windows-and-office/quick-tip-add-fonts-to-the-command-prompt/

Это хороший пример того, какдля установки шрифтов, но я должен удалить многие из этих записей, потому что большинство из них не было добавлено в cmd, потому что cmd их не поддерживает.

Lucida и Consolas - значения по умолчанию.
Растрпо умолчанию здесь нет, может быть, потому что это TTF
Из всех этих я пытался добавить, только 3 добавлено (поддерживается cmd)
Courier New, DejaVu Sans Mono, Droid Sans Mono

DejaVu Sans Mono и Droid Sans Mono доступны для загрузки, поддерживаются cmd, могут иметь хорошую поддержку символов / юникода, но не включают иврит

enter image description here

У меня есть

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 для использования в командной строке.

enter image description here

И, таким образом, вы можете вставлять символы юникода в cmd при условии, что выбранный шрифт его поддерживает.

enter image description here

Чтобы скопировать / вставить, нажмите кнопку "Копировать".кнопка в charmap

Теперь она находится в буфере обмена

Чтобы вставить ее в командную строку, в win7 вставить в командную строку - не ctrl-v.Вы щелкаете правой кнопкой мыши и выбираете вставить.(или, если в режиме быстрого редактирования, просто щелкните правой кнопкой мыши)

enter image description here

Это главное.

Дополнительно

Часто в окнах можно использовать блокнот и карту символов ... но следует помнить о некоторых ограничениях с ними.

Карта символов показывает первые 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 немного ограничен в отношении некоторых команд, таких как 'type', и в отношении каналов и перенаправления.

Если вы используете 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 (который с BOM), а затем возиться, чтобы удалить BOM. (Это немного излишне). Или вы могли бы использовать блокнот, сохранить его как Unicode UTF 16LE ... Но тогда вы не можете подавать в суд на каналы ... (это плохо) .. Проще всего использовать текстовый редактор, такой как notepad2 или notepad ++, поддерживающий UTF8 без спецификации.

Или, если вы делаете все из cmd, вы можете использовать 862 или 65001. Хотя многие текстовые редакторы могут не обеспечить хорошую поддержку 862. Поэтому вы можете предпочесть 65001.

Если вы хотите записать какой-либо файл в блокнот, и его символ больше, чем в UTF16, называется \ uFF, и вы хотите запускать команды в cmd.exe для этого файла, тогда некоторые команды (например, тип команда), будут проблемы, если не учитывать, что поддерживается чем.

Блокнот поддерживает 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 без спецификации.

Получение отображения на иврите может быть самым важным, что нужно сделать в первую очередь, как описано выше. И следующая вещь - это возможность сохранять файлы в текстовом редакторе, который можно отобразить, например, с помощью 'тип'.

И если вы когда-нибудь захотите скопировать из командной строки, если не в режиме быстрого редактирования, щелкните правой кнопкой мыши, затем выберите метку, затем выберите ее и нажмите клавишу ВВОД. И чтобы вставить правой кнопкой мыши и выберите вставить.

Еще один дополнительный пункт -

По-видимому, в chcp 65001 есть ошибки, из-за которых некоторые командные файлы не запускаются и, возможно, некоторые программы на Си тоже не будут работать. Как использовать символы Unicode в командной строке Windows? И я даже видел сбой компилятора c sharp, когда cmd находится в кодовой странице 65001 (хотя можно обвинить компилятор c sharp, можно также обвинить 65001) Почему происходит сбой csc.exe, когда я в последний раз оставил выходную кодировку как UTF8?

Примечание - в более ранней редакции этого ответа было несколько примеров командной строки, но они были излишне сложными. В какой-то момент я мог бы добавить некоторые команды, которые демонстрируют то, что я описывал, но это довольно тривиально.

4 голосов
/ 18 февраля 2012

/u для UTF-16LE, а не UTF-8. Вот почему сохранение файла в формате UTF-16LE (то, что Windows / Notepad ошибочно называет «Unicode») и работа с /u работает так же, как и при работе.

UTF-8 должно быть достижимым с chcp 65001, но есть некоторые неприятные низкоуровневые ошибки в Microsoft C Runtime для этой кодовой страницы, что делает некоторые приложения ненадежными, а некоторые вообще не запускаются .

Так что да, извините, но UTF-8 - гражданка второго сорта под Windows. Все, что использует интерфейсы «ANSI» для ввода-вывода, включая все, что использует стандартную библиотеку ввода-вывода C, включая командную строку, не сможет справиться с этим должным образом.

Единственный надежный способ получить выходные данные Unicode в командной строке - это использовать специфичный для Windows интерфейс WriteConsoleW для прямой отправки строк Unicode. К сожалению, поскольку это не доступно для кроссплатформенности, многие инструменты не будут его использовать.

В любом случае, даже если у вас правильная кодировка, вам все равно нужно иметь в командной строке шрифт, содержащий нужные символы. Я думаю, именно поэтому вы все еще не получаете иврит в маршруте /u + UTF-16LE.

Сводка: Командная строка + не ASCII == почти наверняка сбой. Откажитесь и найдите какой-нибудь другой интерфейс, который вы можете использовать, который лучше поддерживает Unicode.

1 голос
/ 17 февраля 2012

Полагаю, вы говорите "Lucida Console", когда говорите "Lucida".

Используя приложение charmap, я не смог найти ивритских символов в шрифте. Я не знаю, был ли шрифт более эффективным в более ранних версиях Windows, но в Windows 7, похоже, нет ничего, кроме европейских символов.

В моей системе также есть пишущая машинка Lucida Sans, которая содержит ивритские символы. К сожалению, окно Cmd не показывает это как выбор. Вам нужно отредактировать реестр, чтобы открыть больше вариантов, как показано в этом вопросе для SuperUser: https://superuser.com/questions/5035/how-to-change-the-windows-console-font

P.S. Я не смог проверить это решение, потому что Windows сложна. Смотри https://superuser.com/questions/390933/how-to-add-a-font-to-the-cmd-window-choices-in-windows-7-64-bit

1 голос
/ 17 февраля 2012

Вы должны преобразовать file.txt в UTF-16 (Little Endian) до type file.txt

Ссылка: Какую кодировку / кодовую страницу использует cmd.exe?

0 голосов
/ 03 декабря 2016

Как получить установку XP с поддержкой иврита?

Прежде всего, речь идет о XP home SP3, включенном иврите.Под этим я подразумеваю стандартную установку XP в США, или, как мне кажется, с добавлением возможностей иврита для клавиатуры и дисплея.Я полагаю, что каждый компакт-диск XP может установить такую ​​систему.В частности, я считаю, что для такой системы необходимо следующее:

  1. Панель управления -> Параметры даты, времени, языка и региона -> Параметры языка и региона -> на вкладке Язык:1) Нажмите Детали и добавьте еврейскую клавиатуру.2) пометьте V опцией Установить файлы для сложного скрипта и языков с написанием справа налево (включая тайский).
  2. Панель управления -> Дата, время, языковые и региональные параметры -> Язык и региональные параметры -> на вкладке «Дополнительно»: Принять, пометьте буквами V, 10004 (MAC - арабский) и 10005 (Mac - иврит).Не уверен, что арабский язык должен быть здесь.

Теперь к консоли cmd

Необходимо явно добавить шрифты Courier New в реестр шрифтов консоли, как описано ранее.В противном случае явные ивритские шрифты не будут отображаться.

Теперь, когда консоль cmd открыта, все, что нужно сделать для ввода символов иврита, - это включить шрифты Courier New и изменить клавиатуру на режим иврита.Windows прокручивает языки на клавиатуре очень просто.Либо повторное нажатие левой клавиши Alt в сочетании с левыми клавишами Shift, либо с помощью мыши.

Помимо этого, команда dir покажет имена файлов с ивритскими символами.Однако нельзя просто выпустить

dir file_name

и посмотреть обычный вывод, если файл начинается с буквы на иврите.Это должно быть

dir *file_name

Я предполагаю, что символ звездочки добавляет символ Unicode спецификации.

Можно также открыть Блокнот, ввести ивритские символы, сохранить файл как UTF8 и выполнить следующее вкоманды консоли:

chcp 65001
type that_Notepad_file_I_saved

Сохранение файла в формате UTF8 выполняется на экране сохранения в блокноте.

...