Как сделать так, чтобы текстовый файл имел более одной кодировки? - PullRequest
5 голосов
/ 14 февраля 2010

У меня есть файл в кодировке ANSI. Однако он показывает арабские буквы внутри. этот текстовый файл был сгенерирован какой-то программой (у меня нет информации о нем), но кажется, что существует какая-то внутренняя кодировка (если можно так выразиться и если это возможно) для появления арабских букв.

Есть ли такая вещь? Если нет, то как файл ANSI может отображать арабские буквы?

* Если возможно, объяснить в коде Java


Редакция 01

Когда я открываю его в Notepad ++, он показывает, что кодировка страницы - ANSI. Пожалуйста, проверьте это фото:

http://www.4shared.com/file/221862075/e8705951/text-Windows.html


Редакция 02

Вы можете проверить файл по адресу:

http://www.4shared.com/file/221853641/3fa1af8c/data.html

Ответы [ 6 ]

4 голосов
/ 14 февраля 2010

Есть ли такая вещь?

номер

Если нет, то как в файле ANSI могут отображаться арабские буквы?

Это не кодированный в Windows-ANSI файл. Скорее всего, он использует кодирование переменной ширины , скорее всего, UTF-8: многие позиции общих символов в UTF-8 эквивалентно их позициям в US-ASCII (фактически, он был спроектирован таким образом), а также выводом для Windows-ANSI.

РЕДАКТИРОВАТЬ : Мы должны поблагодарить Microsoft за эту путаницу. «ANSI» не очень хорошо определено, когда дело доходит до кодирования. Обычно подразумевается кодировка Windows по умолчанию с кодовой страницей 1252 («Windows-1252»), которая соответствует «западным» алфавитам, производным от латыни.

Однако в других странах кодировка по умолчанию, используемая Windows (в более старых версиях Windows… сегодня по умолчанию используется UTF-8), равна , а не Windows-1252, а скорее другой кодировке, которая также называется «ANSI». В этом случае кодовая страница 1256.

4 голосов
/ 14 февраля 2010

Краткий ответ : Скорее всего, ваш текстовый файл не кодируется "ANSI", а utf-8.

Длинный ответ :

Во-первых, термин «ANSI» (в Windows) не означает фиксированную кодировку; это значение зависит от ваших языковых настроек. Например, в Западной Европе и США это обычно будет Windows-1252 (вариант ISO / IEC 8859-1, также известный как latin-1 ), в Японии, это SHIFT JIS , а в арабских странах это ISO / IEC_8859-6 .

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

Обратите внимание, что я не имею в виду "UNICODE", что в Windows обычно означает UTF-16LE . Это может быть также UTF-8 . Оба являются кодировками, которые могут кодировать все 100.000+ символов, определенных в настоящее время в Unicode, но они делают это по-разному. Оба кода имеют переменную длину , что означает, что не все символы кодируются с использованием одинакового количества битов.

В UTF-8 каждый символ кодируется от одного до четырех байтов. Кодировка была выбрана так, что символы ASCII кодируются одним байтом.

В UTF-16 каждый символ кодируется как два или четыре байта. Эта кодировка изначально была изобретена, когда в Юникоде было меньше 64К символов, и поэтому каждый мог кодировать каждый символ в одном 16-битном слове. Позже, когда стало ясно, что Юникод должен был бы выйти за пределы 64 КБ, была изобретена схема, в которой пары слов в диапазоне 0xD800-0xDFFF используются для представления символов за пределами первых 64К (минус 0x800) символов.

Чтобы увидеть, что на самом деле находится в файле, откройте его в шестнадцатеричном редакторе:

  • Если первые два байта являются FF FE, то, скорее всего, это UTF-16LE (little-endian)
  • Если первые два байта являются FE FF, то, скорее всего, это UTF-16BE (с прямым порядком байтов, маловероятно в Windows)
  • Если первые три байта являются EF BB BF, то, скорее всего, UTF-8
  • Если вы видите много байтов 00, скорее всего это UTF-16 (или UTF-32, если вы видите пары 00 байтов)
  • Если арабские символы занимают один байт, скорее всего это ISO-8859-6 (например, ش будет D5).
  • Если арабские символы занимают несколько байтов, скорее всего, это UTF-8 (например, ش будет D8 B4).
4 голосов
/ 14 февраля 2010

Откуда вы знаете, что он закодирован в ANSI? Если это не многобайтовая кодировка, такая как UTF-8, я думаю, она будет кодироваться с использованием арабской кодовой страницы, подобной этой: Windows-1256 .

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

3 голосов
/ 14 февраля 2010

Я попытался открыть файл в Firefox и Opera. Мне пришлось установить кодировку арабского языка Windows-1256, чтобы он правильно отображался в обоих браузерах, поэтому кодировка файла, скорее всего, будет такой.

Примечание: Первоначально я опубликовал это как комментарий, но меня попросили дать ответ.

1 голос
/ 14 февраля 2010

сначала я скачал ваш файл и попытался использовать vim для проверки его кодировки, и он, похоже, не знал, а на второй машине он сказал latin1, что может быть похоже на то, что произошло в notepad ++ (дал общий ответ) .
так что я сделал file data.txt, и результат был такой:

data.txt: ISO-8859 text, with CRLF line terminators

надеюсь, это поможет.

EDIT
с помощью браузера вещь показала, что этот ответ неверный.

ISO-8859-4 и ISO-8859-13 могут отображать текст без ошибок, но символы не на арабском языке.

1 голос
/ 14 февраля 2010

Кодировка символов ANSI допускает 217 символов и не содержит арабских букв. Я думаю, что, возможно, файл использует альтернативную кодировку.

При редактировании кажется, что проблема в Notepad ++, потому что отображаемое явно выходит за рамки кодировки ANSI.

...