Дело в том, что если INI файл записан в UTF8 и не имеет русских букв, то все хорошо. IniRead его легко читает. Но вот если в файле есть русские буквы, то все. IniRead его прочитать не может. И только после перекодировки в ANSI его сможет прочитать. Поэтому и хотелось бы, что бы файл сразу кодировался в ANSI и читался с любыми (русскими и не русскими) символами.Но для латиницы UTF8 без BOM - это ANSI.
Тем не менееIniWrite пишет либо в ANSI либо в UTF16.
Данный код действительно выводит 256.
Ещё раз повторяю. 256 - это utf8 без bom, который для латиницы полностью совпадает с ansi.Тем не менее
Попробовал ваш скриптIniWrite всегда пишет в ansi
Файл test.ini получился в кодировке UTF8. А где же тут ANSI?IniWrite("test.ini", "test", "test", "test")
$Enc = FileGetEncoding("test.ini")
ConsoleWrite($Enc & @CRLF) ; 256 (UTF8 without BOM)
Попробуем ещё раз. Полученный файл содержит коды символов до 127 включительно. Данные коды соответствуют символам таблиц и ANSI и UTF8. Из двух кодировок AutoIt выбирает UTF8. Поэтому и выводит 256.Файл test.ini получился в кодировке UTF8
IniWrite("test.ini", "тест", "тест", "тест")
$Enc = FileGetEncoding("test.ini")
ConsoleWrite($Enc & @CRLF) ; 512 (ANSI)
И это означает, что файл записан в UTF8. А вы говорите, чтоИз двух кодировок AutoIt выбирает UTF8
Ну не работают ini-функции с utf8
Это означает, что AutoIt из двух одинаковых таблиц кодировок выбрал utf8. Это началось с версии 3.3.14. До этой версии данный код выводил 0 (ANSI).это означает, что файл записан в UTF8
$f = FileOpen("ansi.txt", 2 + 512)
FileWrite($f, "abcdef")
FileClose($f)
$Enc = FileGetEncoding("ansi.txt")
ConsoleWrite($Enc & @CRLF)
Хорошо. Перефразирую. Ini-функции AutoIt не работают с utf8, отличной от латиницы. Также, не работают с латиницей с BOM, если первая строка инишника на пустая.А вы говорите, что
AutoIt тоже можетNotepad может сохранить файл с русскими буквами в UTF8
$f = FileOpen("bom.txt", 2 + 128)
FileWrite($f, "проверка сохранения кириллицы с bom")
FileClose($f)
$f = FileOpen("nobom.txt", 2 + 256)
FileWrite($f, "проверка сохранения кириллицы без bom")
FileClose($f)
ShellExecute("bom.txt")
ShellExecute("nobom.txt")
Открою секрет - там даже китайские "буквы" есть. В этом и смысл юникода.в UTF8 в принципе нет русских букв
Почему вы так решили?Как же он это делает, если в UTF8 в принципе нет русских букв?
Под капотом вызывается функция WritePrivateProfileString(), ей пофиг что сказал AutoIt3.И это означает, что файл записан в UTF8. А вы говорите, что
ANSI это 256 символов, где символы от 128 до 256 являются национальными и зависят от страны, у каждого свои, поэтому текст в ANSI не могут прочитать в других странах.если в UTF8 в принципе нет русских букв?
$sText = ""
For $i = 0x410 To 0x44F
$sText &= ChrW($i)
Next
; Отображает символы Unicode с их кодами от 0x410 до 0x44F
MsgBox(4096, "Символы Unicode от 0x410 до 0x44F", $sText)
Вот теперь понятно. Что-то многовато у AutoIt косяков, мелких, но тем не менее...Это недостаток функций AutoIt
Что за косяк-то? Если вы не умеете использовать, причём тут AutoIt3? AutoIt3 использует две кодировки, обе из которых поддерживают русский язык.Что-то многовато у AutoIt косяков,
Это UTF-16.UTF8 содержит все языки мира, 65535 символов.
Что за косяк-то? Если вы не умеете использовать, причём тут AutoIt3?
Может быть я и не умею его использовать, но и знающие люди так же отмечают это как недостаток.Это недостаток функций AutoIt, а не кодировки utf8.
UTF8 да больше, но я не поднимал вопрос про ширину символов. Просто если мы используем в Windows переменные в формате UTF16, то по сути мы не можем сохранить UTF8 больше чем подразумевает UTF16.Это UTF-16.
UTF8 каждый символ кодирует переменным числом байт, от 1 до 4.
У UTF-8 нет ограничения 65535 символов. Вот и чем я.UTF8 да больше, но я не поднимал вопрос про ширину символов.
Символ может занимать 4 байта в случае суррогатной пары.И я давно уже понял причину использования UTF16: с точки зрения парсинга это постоянная ширина символа