1 (изменено: Dworkin, 2017-01-22 11:43:37)

Тема: AHK: Замена в тексте английских символов на русские

Помогите пожалуйста.
Нашел как заменять английские символы на русские, НО происходит какой-то баг.
Заменяет все символы хорошо, кроме первого большого символа, он ее заменяет на маленькую русскую букву почему-то. Короче заменяет все большие символы на маленькие.
В HEX'e:
английская P = 50
английская p = 70
русская P = D0
русская p = F0
То есть по хексу первая буква была 50(БОЛЬШАЯ англ P), а стала после замены F0(маленькая рус Р).

То есть:


rus := "Растение" ; Слово полностью написано русскими символами
eng := "Pacтeниe" ; Тут буквы "P", "a", "c" два "е" написаны анлийскими символами
; Если просто читать то слова одинаковы, но в хексе разные
rush := StringToHex(rus)
engh := StringToHex(eng)
msgbox, rus: %rus%`nHEX rus: %rush%`neng: %eng%`nHEX eng: %engh% ; показывает в хексе символы

for s, r in {A:"А", a:"а", E:"Е", e:"е", T:"Т", O:"О", o:"о", P:"Р", p:"р", H:"Н", K:"К", k:"к", X:"Х", x:"х", C:"С", c:"с", B:"В", M:"М"} ; слева символ на английском, справа после двоеточия на русском

StringReplace, eng, eng, % s, % r, All ; делает замену
engh := StringToHex(eng)
msgbox, rus: %rus%`nHEX rus: %rush%`neng: %eng%`nHEX eng: %engh%
; видно что заменятся и хекс одинаковый, кроме первой буквы. Первая буква становится маленькой

StringToHex(String)
	{
	local Old_A_FormatInteger, CharHex, HexString
	
	;Return '0' if the string was blank
	If !String
		Return 0
	
	;Save the current Integer format
	Old_A_FormatInteger := A_FormatInteger
	
	;Set the format of integers to their Hex value
	SetFormat, INTEGER, H
	
	;Parse the String
	Loop, Parse, String 
		{
		;Get the ASCII value of the Character (will be converted to the Hex value by the SetFormat Line above)
		CharHex := Asc(A_LoopField)
	
		;Comment out the following line to leave the '0x' intact
		StringTrimLeft, CharHex, CharHex, 2
		
		;Build the return string
		HexString .= CharHex . " "
		}
	;Set the integer format to what is was prior to the call
	SetFormat, INTEGER, %Old_A_FormatInteger%
	
	;Return the string to the caller
	Return HexString
	}

2

Re: AHK: Замена в тексте английских символов на русские

Dworkin
Отредактируйте заголовок, добавьте отсутствующие точки.

Принято. Заголовок приближен к ТЗ.

3 (изменено: Dworkin, 2017-01-22 12:18:26)

Re: AHK: Замена в тексте английских символов на русские

Не понимаю, вставил учет регистра и все равно большую заменяет на маленькую.

StringCaseSense, on

4 (изменено: serzh82saratov, 2017-01-22 13:38:34)

Re: AHK: Замена в тексте английских символов на русские

В массиве ключ "A" и "a" одно и тоже.


#NoEnv
#SingleInstance Force
StringCaseSense, On

oEng := ["A","a","E","e","T","O","o","P","p","H","K","k","X","x","C","c","B","M"]
oRUS := ["А","а","Е","е","Т","О","о","Р","р","Н","К","к","Х","х","С","с","В","М"] 

rus := "Растение" ; Слово полностью написано русскими символами
eng := "Pacтeниe" ; Тут буквы "P", "a", "c" два "е" написаны анлийскими символами
; Если просто читать то слова одинаковы, но в хексе разные
rush := StringToHex(rus)
engh := StringToHex(eng)
msgbox, rus: %rus%`nHEX rus: %rush%`neng: %eng%`nHEX eng: %engh% ; показывает в хексе символы
 
For k, v in oEng
	StringReplace, eng, eng, % v, % oRUS[k], All 

engh := StringToHex(eng)
msgbox, rus: %rus%`nHEX rus: %rush%`neng: %eng%`nHEX eng: %engh%
; видно что заменятся и хекс одинаковый, кроме первой буквы. Первая буква становится маленькой

StringToHex(String)
	{
	local Old_A_FormatInteger, CharHex, HexString
	
	;Return '0' if the string was blank
	If !String
		Return 0
	
	;Save the current Integer format
	Old_A_FormatInteger := A_FormatInteger
	
	;Set the format of integers to their Hex value
	SetFormat, INTEGER, H
	
	;Parse the String
	Loop, Parse, String 
		{
		;Get the ASCII value of the Character (will be converted to the Hex value by the SetFormat Line above)
		CharHex := Asc(A_LoopField)
	
		;Comment out the following line to leave the '0x' intact
		StringTrimLeft, CharHex, CharHex, 2
		
		;Build the return string
		HexString .= CharHex . " "
		}
	;Set the integer format to what is was prior to the call
	SetFormat, INTEGER, %Old_A_FormatInteger%
	
	;Return the string to the caller
	Return HexString
	}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

5

Re: AHK: Замена в тексте английских символов на русские

Спасибо, все работает.