Как сделать так, чтобы текстовый файл имел более одной кодировки?
Вопрос
У меня есть файл в кодировке ANSI.Однако внутри видны арабские буквы.этот текстовый файл был создан какой-то программой (о которой у меня нет информации), но похоже, что существует какая-то внутренняя кодировка (если можно так сказать и если это возможно) для появления арабских букв.
Что-то подобное существует?Если нет, то как файл ANSI может отображать арабские буквы?
*Если возможно, объясните в Java-коде.
Издание 01
Когда я открываю его в Notepad++, он показывает, что кодировка страницы — ANSI.Пожалуйста, проверьте это фото:
http://www.4shared.com/file/221862075/e8705951/text-Windows.html
Издание 02
Вы можете проверить файл по адресу:
Решение
Я пробовал открыть файл как в Firefox, так и в Opera.Мне пришлось установить арабскую кодировку символов Windows-1256, чтобы она корректно отображалась в обоих браузерах, поэтому кодировка файла, скорее всего, будет именно такой.
ПРИМЕЧАНИЕ:Первоначально я разместил это как комментарий, но меня попросили ответить на него.
Другие советы
Откуда вы знаете, что это кодировка ANSI?Если это не многобайтовая кодировка, такая как UTF-8, я предполагаю, что она закодирована с использованием арабской кодовой страницы, такой как эта: Windows-1256.
Вы можете просмотреть файл в шестнадцатеричном редакторе и узнать, какие цифры имеют арабские символы, и таким образом попытаться выяснить, с какой кодировкой/кодовой страницей он был создан.
Короткий ответ:Вероятно, ваш текстовый файл имеет кодировку не ANSI, а utf-8.
Длинный ответ:
Во-первых, термин «ANSI» (в Windows) не означает фиксированную кодировку;его значение зависит от ваших языковых настроек.Например, в Западной Европе и США это обычно будет Windows-1252 (вариант ISO/IEC 8859-1, также известный как Latin-1.), в Японии это Сдвиг ДЖИС, а в арабских странах это ИСО/МЭК_8859-6.
Если вы используете неарабскую версию Windows и не меняли языковые настройки, и вы видите арабские буквы в файле, когда открываете его в Блокноте, то он определенно не находится ни в одной из этих кодировок ANSI.Вместо этого, вероятно, Юникод.
Обратите внимание: я не имею в виду «ЮНИКОД», который в Windows обычно означает UTF-16LE.Возможно UTF-8 также.Обе кодировки могут кодировать все более 100 000 символов, определенных в настоящее время в Юникоде, но делают это по-разному.Оба кодировки переменной длины, Это означает, что не все символы кодируются одинаковым количеством бит.
В UTF-8 каждый символ кодируется от одного до четырех байтов.Кодировка выбрана таким образом, что символы ASCII кодируются одним байтом.
В UTF-16 каждый символ кодируется как два четыре байта.Первоначально эта кодировка была изобретена, когда в Юникоде было менее 64 тысяч символов, и поэтому каждый символ можно было закодировать в одном 16-битном слове.Позже, когда стало ясно, что Unicode придется выйти за пределы ограничения в 64 КБ, была изобретена схема, в которой пары слов в диапазоне 0xD800-0xDFFF используются для представления символов за пределами первых 64 КБ (минус 0x800).
Чтобы увидеть, что на самом деле находится в файле, откройте его в шестнадцатеричном редакторе:
- Если первые два байта — FF FE, то, скорее всего, это UTF-16LE (с прямым порядком байтов).
- Если первые два байта — FE FF, то, скорее всего, это UTF-16BE (с прямым порядком байтов, маловероятно в Windows).
- Если первые три байта — EF BB BF, то, скорее всего, это UTF-8.
- Если вы видите много 00 байт, скорее всего, это UTF-16 (или UTF-32, если вы видите пары 00 байт).
- Если арабские символы занимают один байт, скорее всего, это ISO-8859-6 (например.ش будет D5).
- Если арабские символы занимают несколько байтов, скорее всего, это UTF-8 (например.ش будет D8 B4).
Что-то подобное существует?
Нет.
Если нет, то как файл 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.
Кодировка символов ANSI допускает 217 символов и не содержит арабских букв.Я думаю, возможно, в файле используется альтернативная кодировка.
Судя по вашему редактированию, проблема связана с Notepad++, поскольку то, что отображается, явно выходит за рамки возможностей кодировки ANSI.
сначала я загрузил ваш файл и попытался использовать vim, чтобы проверить его кодировку, но он, похоже, не знал, а на второй машине он сказал: latin1
что может быть похоже на то, что произошло в блокноте ++ (дал общий ответ).
так я и сделал file data.txt
и результат был такой:
data.txt: ISO-8859 text, with CRLF line terminators
надеюсь это поможет.
РЕДАКТИРОВАТЬ:
использование браузера показало, что этот ответ неверен.
ISO-8859-4 и ISO-8859-13 могли отображать текст без ошибок, но символы были не на арабском языке.