Что нового

Смена кодировки строки

antiwinforever

Новичок
Сообщения
25
Репутация
0
Здравствуйте!
Очень надеюсь на помощь.
Есть скрипт, который сохраняет текстовую строку в реестре, в формате "слово слово слово".
Затем считывает эту строку, разделяет ее на слова с помощью
Код:
stringsplit()
по пробелу и забивает в массив.
потом получает от php скрипта строку в формате json, в кодировке utf-8.
Затем проверяет вхождение каждого слова в этой json строке с помощью
Код:
stringinstr()

Проблема в том, что данные из реестра приходят не в utf-8.
Кодировка скрипта utf-8 без BOM.
Проверял данные из php через
Код:
_Encoding_IsUTF8Format()
возвращает true.
А данные из реестра возвращает false.
Пытался с помощью Encoding.au3 преобразовать данные в utf-8. Но получается крокозябра.
Пробовал забивать данные в реестр в бинарном виде, а потом преобразовывать обратно, но на кодировку это никак не влияет.
Пробовал много найденных в инете функций, для конвертации в utf-8, но все выдают крокозябру.
Уже подумываю забить русский алфавит в массив и переписать строку в переменную, сравнивая посимвольно и брать буквы из массива. Проблема буть только с тем, что в реестре могут быть и английские слова. Но это легко предусмотреть. А вот бутел ли это работать и будет ли это целесообразно?

Надеюсь на вашу помощь в решении проблемы.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Ту программку, которая забивает данные в реестр, перепишите. Пусть она все в utf-8 сама перекодирует.

А так нету никаких проблем с кодировкой, вот смотрите простой скрипт:
Код:
Local $sData = 'töšük'
RegWrite("HKEY_CURRENT_USER\Software\!Test", "TestKey", "REG_SZ", $sData)

Local $sFromReg = RegRead("HKEY_CURRENT_USER\Software\!Test", "TestKey")
MsgBox(0, 'Из реестра', $sFromReg)

MsgBox(0, 'Покажет True если строки равны', $sData = $sFromReg)

Обратите внимание на töšük в переменной, когда вы сделаете скрипт, то он должен быть в кодировке UTF-8.
 

Вложения

  • Скриншот 2017-05-30 13.36.56.png
    Скриншот 2017-05-30 13.36.56.png
    2 КБ · Просмотры: 88
  • Скриншот 2017-05-30 13.36.59.png
    Скриншот 2017-05-30 13.36.59.png
    2.4 КБ · Просмотры: 7
Автор
A

antiwinforever

Новичок
Сообщения
25
Репутация
0
inververs, если сравнивать две переменные, то понятно что будет true.
Но мне нужно именно найти вхождение слова из реестра в тексте.
С stringinstr это уже не прокатывает. попробую записывать в реестр уже в utf-8, потом напишу о результате. Сама строка перед записью в реестр, считывается из guictrlinput. Элемента Gui.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
antiwinforever [?]
inververs, если сравнивать две переменные, то понятно что будет true.Но мне нужно именно найти вхождение слова из реестра в тексте.С stringinstr это уже не прокатывает.
А такой скрипт у вас работает?
Код:
$Form1 = GUICreate("Form1", 377, 80, 530, 468)
$Input1 = GUICtrlCreateInput("töšük", 8, 8, 121, 21)
$Button1 = GUICtrlCreateButton("Записать в реестр", 144, 8, 115, 25)
$Input2 = GUICtrlCreateInput("š", 8, 40, 121, 21)
$Button2 = GUICtrlCreateButton("Прочитать из реестра и сравнить", 144, 40, 219, 25)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case -3
			Exit
		Case $Button1
			RegWrite("HKEY_CURRENT_USER\Software\!Test", "TestKey", "REG_SZ", GUICtrlRead($Input1))
		Case $Button2
			$sFrom = RegRead("HKEY_CURRENT_USER\Software\!Test", "TestKey")
			If StringInStr($sFrom, GUICtrlRead($Input2)) Then
				MsgBox(0, '', 'Есть StringInStr')
			Else
				MsgBox(0, '', 'Нет')
			EndIf
	EndSwitch
WEnd
 
Автор
A

antiwinforever

Новичок
Сообщения
25
Репутация
0
inververs сказал(а):
antiwinforever [?]
inververs, если сравнивать две переменные, то понятно что будет true.Но мне нужно именно найти вхождение слова из реестра в тексте.С stringinstr это уже не прокатывает.
А такой скрипт у вас работает?
Да работает.
Попробовал записать в реестр в utf-8. Использовал _Encoding_StringToUTF8(). Сохраняет в виде: тест
потом можно используя
Код:
BinaryToString(RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\test", "test"), 4)

нормально получить текст. Пробовал потом сравнивать с json строкой. Сравнивать не преобразуя в нормальный вид. Сравнивать преобразуя json строку в utf-8. Все бесполезно.
а у вас в примере: töšük
Код:
BinaryToString("töšük", 4)

выдает tosuk.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
antiwinforever
потом можно используя <...> получить текст
И текст будет в ANSI.

Сравнивать преобразуя json строку в utf-8
Не понял. Сначала вы пишете "получает от php скрипта строку в формате json, в кодировке utf-8". А теперь пытаетесь преобразовать UTF-8 в UTF-8 ?! :stars:
Может вам не данные реестра в UTF-8 переводить, а наоборот, строку php скрипта из UTF-8 в ANSI ? :scratch:

Естественно. А вы чего ожидали?

Вы бы сделали небольшой скрипт, воспроизводящий вашу проблему. А то можно долго гадать, что у вас не так.
 
Автор
A

antiwinforever

Новичок
Сообщения
25
Репутация
0
InnI сказал(а):
Не понял. Сначала вы пишете "получает от php скрипта строку в формате json, в кодировке utf-8". А теперь пытаетесь преобразовать UTF-8 в UTF-8 ?! :stars:
Это я на всякий случай. Спасибо всем за помощь. Разобрался. Перед записью в реестр, перевожу в utf-8 и все работает. Просто еще одна ошибка в скрипте была.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
antiwinforever
OffTopic:
Вы может проверяете результат в консоли? Консоль не может utf-8, лучше смотрите в msgbox



Добавлено:
Сообщение автоматически объединено:

InnI
Просто мне кажется, что antiwinforever, вообще не понимает что такое кодировка, и в какой момент у него текст становится ANSI, поэтому он нашел костылик в виде _Encoding_StringToUTF8
 
Верх