1 (изменено: Dworkin, 2017-11-06 00:17:08)

Тема: AHK: изменить кодировку переменной

Доброй ночи.
Скрипт получает русский текст такого вида: "сампик". Не знаю как перевести в другую кодировку.
С помощью онлайн декодера удалось получить нормальный текст.
Один онлайн декодер пишет что исходная кодировка UTF-8 отображается как WINDOWS-1252.
Другой онлайн декодер ISO-8859-1 --> UTF-8.

Выдает пустое значение.


string = сампик
VarSetCapacity(ansi, StrPut(string, "UTF-8")), StrPut(string, &ansi, "UTF-8")
string := StrGet(&ansi, "windows-1252")
msgbox % string
exitapp

Тоже выдает пустое значение.


string = сампик
VarSetCapacity(ansi, StrPut(string, "ISO-8859-1")), StrPut(string, &ansi, "ISO-8859-1")
string := StrGet(&ansi, "UTF-8")
msgbox % string
exitapp

2

Re: AHK: изменить кодировку переменной

Кодировка в автохотки не может равняться "ISO-8859-1".
Переведите ее в Code Page Identifiers.

3 (изменено: Dworkin, 2017-11-06 01:19:18)

Re: AHK: изменить кодировку переменной

https://msdn.microsoft.com/en-us/librar … s.85).aspx
Заменил "ISO-8859-1" на 28591.
Теперь что-то выдает, но не нормальный текст


string := "сампик"
VarSetCapacity(ansi, StrPut(string, 28591)), StrPut(string, &ansi, 28591)
string := StrGet(&ansi, "UTF-8")
msgbox % string
exitapp

Так же заменил "windows-1252" на 1252.
Тоже выдает, но опять не то.


string = сампик
VarSetCapacity(ansi, StrPut(string, "UTF-8")), StrPut(string, &ansi, "UTF-8")
string := StrGet(&ansi, 1252)
msgbox % string
exitapp

4

Re: AHK: изменить кодировку переменной

https://autohotkey.com/docs/commands/FileEncoding.htm

5

Re: AHK: изменить кодировку переменной

Если так то в текстовом документе нормальный текст

string := "сампик"
FileAppend, %string%, test.txt, CP1252

У меня скрипт через апи получает данные в переменную. Скажите пожалуйста куда пихать FileEncoding?

6

Re: AHK: изменить кодировку переменной

Не надо его пихать.
В 5 коде вы написали правильно кодировку - CP1252.
А в 4 коде нет - 28591.

7

Re: AHK: изменить кодировку переменной

Получилось.


string := "сампик"
VarSetCapacity(ansi, StrPut(string, "CP28591")), StrPut(string, &ansi, "CP28591")
string := StrGet(&ansi, "UTF-8")
msgbox % string
exitapp

Спасибо.

8 (изменено: Dworkin, 2017-11-07 04:15:46)

Re: AHK: изменить кодировку переменной

Извиняюсь что поднимаю тему, но оказывается если autohotkey в ansi 32-bit то получаемый текст такой: "?????????µ??" если в unicode 32-bit, то выше код с помощью которого можно поменять кодировку и все становится хорошо.
Пробывал то что здесь написано:
https://elims.org.ua/blog/krakozyabry-i … kodirovka/
не помогло.
Подскажите что делать?
P.S. Такое только при получении русских символов.

9

Re: AHK: изменить кодировку переменной

FileEncoding [, Encoding] - устанавливается в секции автовыполнения, там же где и все директивы и указания настроек поведения скрипта. Пробовали ставить?

10

Re: AHK: изменить кодировку переменной

KusochekDobra пишет:

FileEncoding [, Encoding] - устанавливается в секции автовыполнения, там же где и все директивы и указания настроек поведения скрипта. Пробовали ставить?

В самом верху писал "FileEncoding, CP28591", CP65001 и др...Без изменений.

11

Re: AHK: изменить кодировку переменной

А зачем вы используете Ansi версию?

12

Re: AHK: изменить кодировку переменной

Dworkin пишет:

В самом верху писал "FileEncoding, CP28591", CP65001 и др...Без изменений.

Если вы указали FileEncoding, как UTF-8, то ваш скрипт перекодирования уже не надо использовать. Он всё испортит.

13 (изменено: svoboden, 2017-11-07 11:26:41)

Re: AHK: изменить кодировку переменной

CP1251 поставьте вместо CP28591.

14

Re: AHK: изменить кодировку переменной

svoboden, и что должно получиться?

string := "сампик"
VarSetCapacity(ansi, StrPut(string, "CP28591")), StrPut(string, &ansi, "CP28591")
string := StrGet(&ansi, "UTF-8")
msgbox % string
exitapp

15

Re: AHK: изменить кодировку переменной

YMP пишет:

Если вы указали FileEncoding, как UTF-8, то ваш скрипт перекодирования уже не надо использовать. Он всё испортит.

Я и указывал и убирал. Вопросики так и остались.

Malcev пишет:

А зачем вы используете Ansi версию?

Одна библиотека которая мне нужна работает только на анси версии.

16 (изменено: svoboden, 2017-12-16 05:39:06)

Re: AHK: изменить кодировку переменной

У меня все работает, если CP1251 поставить вместо CP28591.
string := "сампик".

17

Re: AHK: изменить кодировку переменной

Неудивительно, так как у вас изначальная кодировка "сампик" - 1251.
А у автора "сампик" - 28591.

18

Re: AHK: изменить кодировку переменной

Dworkin пишет:

Я и указывал и убирал. Вопросики так и остались.

Я имел в виду указать кодировку + убрать ваш скрипт для перекодирования.

19 (изменено: svoboden, 2017-11-07 15:30:51)

Re: AHK: изменить кодировку переменной

У меня как-то автоматически переводилась кодировка из CP28591 в CP1251.

20 (изменено: Dworkin, 2017-11-07 20:10:44)

Re: AHK: изменить кодировку переменной

YMP пишет:

Я имел в виду указать кодировку + убрать ваш скрипт для перекодирования.

Я в скрипте вывожу то что получаю от api, а затем вывожу после перекодирования что бы увидеть разницу. FileEncoding не помогло.

Я так же сохранил код в текстовый документ .txt, а затем сохранял как .ahk выбирая разную кодировку. Не помогло.

21 (изменено: Dworkin, 2017-11-07 20:22:40)

Re: AHK: изменить кодировку переменной

Кстати я думаю что библиотека не работает с unicode из-за DllCall.
https://github.com/agrippa1994/DX9-Over … verlay.ahk
Можете пожалуйста глянуть и сказать можно ли сделать что бы работало на Unicode? Я имею виду типо заменить str на ptr к примеру. И сказать что по заменять.

22 (изменено: Dworkin, 2017-11-07 21:45:11)

Re: AHK: изменить кодировку переменной

stealzy пишет:

Почему не на WStr?

Потому что я не понимал и написал наобум.
Удалил ненужные функции. В Ansi работает, в Unicode нет.
Заменил Str, на WStr.
И как тут написано https://lexikos.github.io/v1/docs/commands/DllCall.htm
Поставил в конце функций W:
"LoadLibraryW"
"GetProcAddressW"
Может надо что-то еще заменить?

#NoEnv 

PATH_OVERLAY := "D:\test\dx9_overlay.dll"

hModule := DllCall("LoadLibraryW", WStr, PATH_OVERLAY)
if(hModule == -1 || hModule == 0)
{
	MsgBox, 48, Error, The dll-file couldn't be loaded!
	ExitApp
}


Init_func := DllCall("GetProcAddressW", UInt, hModule, WStr, "Init")
SetParam_func := DllCall("GetProcAddressW", UInt, hModule, WStr, "SetParam")
TextCreate_func := DllCall("GetProcAddressW", UInt, hModule, WStr, "TextCreate")
DestroyAllVisual_func := DllCall("GetProcAddressW", UInt, hModule, WStr, "DestroyAllVisual")
TextDestroy_func := DllCall("GetProcAddressW", UInt, hModule, WStr, "TextDestroy")
TextSetShown_func := DllCall("GetProcAddressW", UInt, hModule, WStr, "TextSetShown")
TextSetString_func := DllCall("GetProcAddressW", UInt, hModule, WStr, "TextSetString")


Init()
{
	global Init_func
	res := DllCall(Init_func)
	return res
}

SetParam(str_Name, str_Value)
{
	global SetParam_func
	res := DllCall(SetParam_func, WStr, str_Name, WStr, str_Value)
	return res
}

TextCreate(Font, fontsize, bold, italic, x, y, color, text, shadow, show)
{
	global TextCreate_func
	res := DllCall(TextCreate_func,WStr,Font,Int,fontsize,UChar,bold,UChar,italic,Int,x,Int,y,UInt,color,WStr,text,UChar,shadow,UChar,show)
	return res
}

TextDestroy(id)
{
	global TextDestroy_func
	res := DllCall(TextDestroy_func,Int,id)
	return res
}

TextSetShown(id, show)
{
	global TextSetShown_func
	res := DllCall(TextSetShown_func,Int,id,UChar,show)
	return res
}

TextSetString(id,Text)
{
	global TextSetString_func
	res := DllCall(TextSetString_func,Int,id,WStr,Text)
	return res
}

DestroyAllVisual()
{
	global DestroyAllVisual_func
	res := DllCall(DestroyAllVisual_func)
	return res 
}

23

Re: AHK: изменить кодировку переменной

Легче будет через stringreplace символы заменять.

24

Re: AHK: изменить кодировку переменной

Решил проблему запуска на ахк unicode.
Заменил Str, на AStr.
LoadLibrary на LoadLibraryA.
Странно, но GetProcAddress не надо трогать иначе не будет работать.

#NoEnv 

PATH_OVERLAY := "E:\testspeech\recor and send\dx9_overlay.dll"

hModule := DllCall("LoadLibraryA",AStr, PATH_OVERLAY)
if(hModule == -1 || hModule == 0)
{
	MsgBox, 48, Error, The dll-file couldn't be loaded!
	ExitApp
}


Init_func 				:= DllCall("GetProcAddress", UInt, hModule, AStr, "Init")
SetParam_func 			:= DllCall("GetProcAddress", UInt, hModule, AStr, "SetParam")

TextCreate_func 		:= DllCall("GetProcAddress", UInt, hModule, AStr, "TextCreate")
DestroyAllVisual_func	:= DllCall("GetProcAddress", UInt, hModule, AStr, "DestroyAllVisual")
TextDestroy_func 		:= DllCall("GetProcAddress", UInt, hModule, AStr, "TextDestroy")
TextSetShown_func 		:= DllCall("GetProcAddress", UInt, hModule, AStr, "TextSetShown")
TextSetString_func 		:= DllCall("GetProcAddress", UInt, hModule, AStr, "TextSetString")


Init()
{
	global Init_func
	res := DllCall(Init_func)
	return res
}

SetParam(str_Name, str_Value)
{
	global SetParam_func
	res := DllCall(SetParam_func, AStr, str_Name, AStr, str_Value)
	return res
}

TextCreate(Font, fontsize, bold, italic, x, y, color, text, shadow, show)
{
	global TextCreate_func
	res := DllCall(TextCreate_func,AStr,Font,Int,fontsize,UChar,bold,UChar,italic,Int,x,Int,y,UInt,color,AStr,text,UChar,shadow,UChar,show)
	return res
}

TextDestroy(id)
{
	global TextDestroy_func
	res := DllCall(TextDestroy_func,Int,id)
	return res
}

TextSetShown(id, show)
{
	global TextSetShown_func
	res := DllCall(TextSetShown_func,Int,id,UChar,show)
	return res
}

TextSetString(id,Text)
{
	global TextSetString_func
	res := DllCall(TextSetString_func,Int,id,AStr,Text)
	return res
}

DestroyAllVisual()
{
	global DestroyAllVisual_func
	res := DllCall(DestroyAllVisual_func)
	return res 
}