Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


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
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:25, 11-09-2006 | #361