A
Alecsis1
Гость
Недавно в результате «пляски с бубном» обнаружил, что IniRead() спотыкается на .INI, сохранённых в кодировке UTF-8 c сигнатурой (т.н. «with BOM»).
Вместе с тем, UTF-8 без BOM и оба варианта UTF-16 (как с сигнатурой, так и без неё) обрабатываются нормально.
Код:
Протокол «лабораторной работы»:
P.S. №1 Кстати, IniReadSection() и IniReadSectionNames() ведут себя аналогично; остальные Ini…() проверять не стал, предполагая тот же эффект.
P.S. №2 Примеры .INI в разных кодировках см. во вложении.
Вместе с тем, UTF-8 без BOM и оба варианта UTF-16 (как с сигнатурой, так и без неё) обрабатываются нормально.
Код:
Код:
; IniRead() и .INI, сохранённые в Unicode
;
Opt('MustDeclareVars', True)
Local Const $csIni_UTF16 = 'ini_UTF-16.ini', _
$csIni_UTF16b = 'ini_UTF-16b.ini', _
$csIni_UTF8 = 'ini_UTF-8.ini', _
$csIni_UTF8b = 'ini_UTF-8b.ini'
Local $sValue
; Проба c кодировкой Unicode UTF-8 с сигнатурой
;
$sValue = IniRead($csIni_UTF8b, 'Main', 'Key1', 'Not found!')
ConsoleWrite($csIni_UTF8b & ' -- UTF-8 + BOM' & @CRLF)
ConsoleWrite('$sValue = "' & $sValue & '"' & @CRLF)
; Проба c кодировкой Unicode UTF-8 без сигнатуры (BOM)
;
ConsoleWrite($csIni_UTF8 & ' -- UTF-8 without BOM' & @CRLF)
$sValue = IniRead($csIni_UTF8, 'Main', 'Key1', 'Not found!')
ConsoleWrite('$sValue = "' & $sValue & '"' & @CRLF)
; Проба c кодировкой Unicode UTF-16 с сигнатурой
;
ConsoleWrite($csIni_UTF16b & ' -- UTF-16 + BOM' & @CRLF)
$sValue = IniRead($csIni_UTF16b, 'Main', 'Key1', 'Not found!')
ConsoleWrite('$sValue = "' & $sValue & '"' & @CRLF)
; Проба c кодировкой Unicode UTF-16 без сигнатуры (BOM)
;
ConsoleWrite($csIni_UTF16 & ' -- UTF-16 without BOM' & @CRLF)
$sValue = IniRead($csIni_UTF16, 'Main', 'Key1', 'Not found!')
ConsoleWrite('$sValue = "' & $sValue & '"' & @CRLF)
Exit
Код:
>"H:\DevStudio\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.exe" /run /prod /ErrorStdOut /in "F:\Alecsis\Prog\AutoIt\Debug\ini_test.au3" /UserParams
+>14:23:35 Starting AutoIt3Wrapper v.2.1.2.9 Environment(Language:0409 Keyboard:00000409 OS:WIN_XP/Service Pack 3 CPU:X64 OS:X86)
>Running AU3Check (1.54.22.0) from:H:\DevStudio\AutoIt3
+>14:23:35 AU3Check ended.rc:0
>Running:(3.3.8.1):H:\DevStudio\AutoIt3\autoit3.exe "F:\Alecsis\Prog\AutoIt\Debug\ini_test.au3"
--> Press Ctrl+Alt+F5 to Restart or Ctrl+Break to Stop
ini_UTF-8b.ini -- UTF-8 + BOM
$sValue = "Not found!"
ini_UTF-8.ini -- UTF-8 without BOM
$sValue = "value #1"
ini_UTF-16b.ini -- UTF-16 + BOM
$sValue = "value #1"
ini_UTF-16.ini -- UTF-16 without BOM
$sValue = "value #1"
+>14:23:35 AutoIt3.exe ended.rc:0
>Exit code: 0 Time: 0.659
P.S. №2 Примеры .INI в разных кодировках см. во вложении.