Краткий ответ : Скорее всего, ваш текстовый файл не кодируется "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).