Creat0R
Цитата:
и если этот файл будет в кодировке UTF-8, то в MsgBox выведутся каракули, как можно это исправить?
|
вариант реализации функции преобразования кодировок и пример использования:
Код:

$file = "test.txt"
$foo = FileOpen($file, 4) ; 4 - RAW-режим!
$text = _Utf8ToAnsi(FileRead($foo,FileGetSize($file)))
MsgBox(0,"Test",$text)
FileClose ($foo)
; Пример преобразования UTF-8 в ANSI
; другие варианты кодировок:
; 0 - ANSI
; 1 - OEM
; 2 - MAC
; 42 - Symbol
; 65000 - UTF-7
; 65001 - UTF-8
Func _Utf8ToAnsi($utf8String)
Return _Uni2Any(_Any2Uni($utf8String, 65001),0)
EndFunc
; Преобразование символьной строки заданной кодировки в юникод
Func _Any2Uni($anyString, $codePage)
Local $bufSize = StringLen($anyString) * 2
Local $buf = DllStructCreate("byte[" & $bufSize & "]")
Local $ret = DllCall("Kernel32.dll", "int", "MultiByteToWideChar", _
"int", $codePage, _
"int", 0, _
"str", $anyString, _
"int", StringLen($anyString), _
"ptr", DllStructGetPtr($buf), _
"int", $bufSize)
Local $uniString = StringLeft(DllStructGetData($buf, 1), $ret[0] * 2)
$buf = 0
Return $uniString
EndFunc
; Преобразование юникода в символьную строку заданной кодировки
Func _Uni2Any($uniString, $codePage)
Local $uniStringLen = StringLen($uniString)
Local $bufLen = $uniStringLen * 2
Local $in = DllStructCreate("byte[" & $bufLen & "]")
Local $out= DllStructCreate("char[" & $bufLen & "]")
DllStructSetData($in, 1, $uniString)
Local $ret = DllCall("kernel32.dll", "int", "WideCharToMultiByte", _
"int", $codePage, _
"int", 0, _
"ptr", DllStructGetPtr($in), _
"int", $uniStringLen / 2, _
"ptr", DllStructGetPtr($out), _
"int", $bufLen, _
"int", 0, _
"int", 0)
Local $anyString = DllStructGetData($out, 1)
$out= 0
$in = 0
Return $anyString
EndFunc