1

Тема: AHK: Смена кодировки текста в переменной

Необходимо сменить кодировку текста в переменной с UTF-8 в ANSI и обратно.
Как это делается?
Рабочая версия AutoHotkey Unicode

2 (изменено: YMP, 2015-02-23 22:35:47)

Re: AHK: Смена кодировки текста в переменной

А вы уверены, что он там именно в UTF-8? Родная кодировка для строк в юникодном АНК —  UTF-16. Но если таки да, т.е. переменная используется просто как буфер, то сначала прочитать StrGet как UTF-8, потом записать StrPut как ANSI. Или наоборот.

Учесть размер буфера, чтобы не вылезти за его пределы (во втором случае).

3

Re: AHK: Смена кодировки текста в переменной

Может и в UTF-16.
Я  не особо понимаю как эти функции использовать: StrGet и StrPut.
Проблема возникает в этом скрипте, который переводит строку в HEX и обратно HEX в строку.
Раньше на версии AutoHotkey ANSI все работало отлично, а теперь на выходе бяки.

StrToHex = Привет Мир!

StrtoHex:
SetFormat, Integer, H
CodeString =
Loop, Parse, StrToHex
{
  CharCode := Asc(A_LoopField)
  If CharCode < 0x10
    CodeString .= "0" . SubStr(CharCode, 3)
  Else
    CodeString .= SubStr(CharCode, 3)
}
StringUpper, CodeString, CodeString
MsgBox %CodeString%



HextoStr:
HextoStr = %CodeString%
Text =
Pos = 1
Loop, % StrLen(HextoStr) / 2
{
  CharCode := "0x" . SubStr(HextoStr, Pos, 2)
  Text .= Chr(CharCode)
  Pos += 2
}
MsgBox %Text%
return

4

Re: AHK: Смена кодировки текста в переменной

В Юникоде код символа — это два байта, т.е. в хексе будет 4 символа. С поправкой на это, вроде всё работает.


StrToHex = Привет Мир!

StrtoHex:
SetFormat, Integer, H
CodeString =
Loop, Parse, StrToHex
{
  CharCode := Asc(A_LoopField)
  CodeString .= SubStr("000" . SubStr(CharCode, 3), -3)
}
StringUpper, CodeString, CodeString
MsgBox %CodeString%



HextoStr:
HextoStr = %CodeString%
Text =
Pos = 1
Loop, % StrLen(HextoStr) // 4
{
  CharCode := "0x" . SubStr(HextoStr, Pos, 4)
  Text .= Chr(CharCode)
  Pos += 4
}
MsgBox %Text%
return