Что нового

Случайно ни у кого не завалялась функция перевода текста 866->1251 (или Utf-8)?

Latoid

Знающий
Сообщения
95
Репутация
11
Собственно сабж )
В отрицательном случае подскажите, пож., какую-нибудь консольную утилиту для этих целей
 
Автор
L

Latoid

Знающий
Сообщения
95
Репутация
11
Сам написал. Всё оказалось в тысячу раз проще, чем думалось)

Код:
Func _DOS2WIN($String)
	Local $sResult = "", $iCode 
	Local $Var866Arr = StringSplit($String, "")
	For $i = 1 To $Var866Arr[0]
		$iCode = Asc($Var866Arr[$i])
		Select
			Case $iCode >= 128 And $iCode <= 175
				$Var866Arr[$i] = Chr ($iCode + 64)
			Case $iCode >= 224 And $iCode <= 239
				$Var866Arr[$i] = Chr ($iCode + 16)
			Case $iCode = 240
				$Var866Arr[$i] = Chr (168)
			Case $iCode = 241
				$Var866Arr[$i] = Chr (184)
			Case $iCode = 252
				$Var866Arr[$i] = Chr (185)
		EndSelect
		$sResult &= $Var866Arr[$i] 
	Next 
	Return $sResult 
EndFunc ; ==> _DOS2WIN
 
Автор
L

Latoid

Знающий
Сообщения
95
Репутация
11
Вдогонку - функция KOI-8 -> 1251

Код:
Func _KOI2WIN($String)
	Local $sResult = "", $iCode 
	Local $VarKOIArr = StringSplit($String, "")
	For $i = 1 To $VarKOIArr[0]
		$iCode = Asc($VarKOIArr[$i])
		Select
			Case $iCode = 63
				$VarKOIArr[$i] = Chr (185)
			Case $iCode = 163
				$VarKOIArr[$i] = Chr (184)
			Case $iCode = 179
				$VarKOIArr[$i] = Chr (168)
			Case $iCode >= 233 And $iCode <= 240
				$VarKOIArr[$i] = Chr ($iCode - 33)
			Case $iCode >= 242 And $iCode <= 245
				$VarKOIArr[$i] = Chr ($iCode - 34)
			Case $iCode >= 201 And $iCode <= 208
				$VarKOIArr[$i] = Chr ($iCode + 31)
			Case $iCode >= 210 And $iCode <= 213
				$VarKOIArr[$i] = Chr ($iCode + 30)
			Case $iCode >= 225 And $iCode <= 226
				$VarKOIArr[$i] = Chr ($iCode - 33)
			Case $iCode >= 228 And $iCode <= 229
				$VarKOIArr[$i] = Chr ($iCode - 32)
			Case $iCode >= 193 And $iCode <= 194
				$VarKOIArr[$i] = Chr ($iCode + 31)
			Case $iCode = 247
				$VarKOIArr[$i] = Chr (194)
			Case $iCode = 231
				$VarKOIArr[$i] = Chr (195)
			Case $iCode = 246
				$VarKOIArr[$i] = Chr (198)
			Case $iCode = 250
				$VarKOIArr[$i] = Chr (199)
			Case $iCode = 230
				$VarKOIArr[$i] = Chr (212)
			Case $iCode = 232
				$VarKOIArr[$i] = Chr (213)
			Case $iCode = 227
				$VarKOIArr[$i] = Chr (214)
			Case $iCode = 254
				$VarKOIArr[$i] = Chr (215)
			Case $iCode = 251
				$VarKOIArr[$i] = Chr (216)
			Case $iCode = 253
				$VarKOIArr[$i] = Chr (217)
			Case $iCode = 255
				$VarKOIArr[$i] = Chr (218)
			Case $iCode = 249
				$VarKOIArr[$i] = Chr (219)
			Case $iCode = 248
				$VarKOIArr[$i] = Chr (220)
			Case $iCode = 252
				$VarKOIArr[$i] = Chr (221)
			Case $iCode = 224
				$VarKOIArr[$i] = Chr (222)
			Case $iCode = 241
				$VarKOIArr[$i] = Chr (223)
			Case $iCode = 215
				$VarKOIArr[$i] = Chr (226)
			Case $iCode = 199
				$VarKOIArr[$i] = Chr (227)
			Case $iCode = 196
				$VarKOIArr[$i] = Chr (228)
			Case $iCode = 197
				$VarKOIArr[$i] = Chr (229)
			Case $iCode = 214
				$VarKOIArr[$i] = Chr (230)
			Case $iCode = 218
				$VarKOIArr[$i] = Chr (231)
			Case $iCode = 198
				$VarKOIArr[$i] = Chr (244)
			Case $iCode = 200
				$VarKOIArr[$i] = Chr (245)
			Case $iCode = 195
				$VarKOIArr[$i] = Chr (246)
			Case $iCode = 222
				$VarKOIArr[$i] = Chr (247)
			Case $iCode = 219
				$VarKOIArr[$i] = Chr (248)
			Case $iCode = 221
				$VarKOIArr[$i] = Chr (249)
			Case $iCode = 223
				$VarKOIArr[$i] = Chr (250)
			Case $iCode = 217
				$VarKOIArr[$i] = Chr (251)
			Case $iCode = 216
				$VarKOIArr[$i] = Chr (252)
			Case $iCode = 220
				$VarKOIArr[$i] = Chr (253)
			Case $iCode = 192
				$VarKOIArr[$i] = Chr (254)
			Case $iCode = 209
				$VarKOIArr[$i] = Chr (255)
		EndSelect
		$sResult &= $VarKOIArr[$i] 
	Next 
	Return $sResult 
EndFunc ; _KOI2WIN



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

И ещё - функция автоопределения кодировки текста. Основана на статистических свойствах букв русского языка – подсчитывается количество строчных и заглавных букв А, И, О, Т в различных кодировках. Требует не менее трёх-четырёх осмысленных слов для уверенного определения.

Код:
ConsoleWrite (_WhatIsEncoding ("мой дядя самых честных правил когда не в шутку занемог он уважать себя заставил и лучше выдумать не мог") & @CRLF)
ConsoleWrite (_WhatIsEncoding ("¬Rc ¤п¤п б ¬ле з_бв-ле Їа ўЁ< ЄR_¤  -_ ў игвЄг  -_¬R_ R- гў ¦ вм б_Ўп  бв ўЁ< Ё <гзи_ ўл¤г¬ вм -_ ¬R_") & @CRLF)
ConsoleWrite (_WhatIsEncoding ("НПК ДСДС УБНЩИ ЮЕУФОЩИ РТБЧЙМ ЛПЗДБ ОЕ Ч ЫХФЛХ ЪБОЕНПЗ ПО ХЧБЦБФШ УЕВС ЪБУФБЧЙМ Й МХЮЫЕ ЧЩДХНБФШ ОЕ НПЗ") & @CRLF)
ConsoleWrite (_WhatIsEncoding ("ЬЮЩ ФпФп бРЬле зХбвЭле ЯаРТШЫ ЪЮУФР ЭХ Т игвЪг ЧРЭХЬЮУ ЮЭ гТРЦРвм бХСп ЧРбвРТШЫ Ш ЫгзиХ ТлФгЬРвм ЭХ ЬЮУ") & @CRLF)

Func _WhatIsEncoding ($String)
	Local $iCode, $wincount = 0, $doscount = 0, $koicount = 0, $isocount = 0
	Local $VarString = StringSplit($String, "")
	For $i = 1 To $VarString[0]
		$iCode = Asc($VarString[$i])
		Select
			Case $iCode = 192 Or $iCode = 224 Or $iCode = 200 Or $iCode = 232 Or $iCode = 206 Or $iCode = 238 Or $iCode = 210 Or $iCode = 242
				$wincount +=1
			Case $iCode = 128 Or $iCode = 160 Or $iCode = 136 Or $iCode = 168 Or $iCode = 142 Or $iCode = 174 Or $iCode = 146
				$doscount +=1
			Case $iCode = 225 Or $iCode = 193 Or $iCode = 233 Or $iCode = 201 Or $iCode = 239 Or $iCode = 207 Or $iCode = 244 Or $iCode = 212
				$koicount +=1
			Case $iCode = 176 Or $iCode = 208 Or $iCode = 184 Or $iCode = 216 Or $iCode = 190 Or $iCode = 222 Or $iCode = 194
				$isocount +=1
			Case $iCode = 226
				$doscount +=1
				$isocount +=1
		EndSelect
	Next
	If $wincount > $koicount And $wincount > $doscount And $wincount > $isocount Then
		Return "win"
	ElseIf $doscount > $koicount And $doscount > $wincount And $doscount > $isocount Then
		Return "dos"
	ElseIf $koicount > $wincount And $koicount > $doscount And $koicount > $isocount Then
		Return "koi"
	ElseIf $isocount > $wincount And $isocount > $doscount And $isocount > $koicount Then
		Return "iso"
	Else
		Return False
	EndIf
EndFunc ; ==> _WhatIsEncoding
 
Автор
L

Latoid

Знающий
Сообщения
95
Репутация
11
ISO -> 1251
Код:
Func _ISO2WIN ($String)
	Local $sResult = "", $iCode 
	Local $VarISOArr = StringSplit($String, "")
	For $i = 1 to $VarISOArr[0]
		$iCode = Asc($VarISOArr[$i])
		Select
			Case $iCode >= 176 And $iCode <= 239
				$VarISOArr[$i] = Chr ($iCode + 16)
			Case $iCode = 161
				$VarISOArr[$i] = Chr (168)
			Case $iCode = 241
				$VarISOArr[$i] = Chr (184)
			Case $iCode = 240
				$VarISOArr[$i] = Chr (185)
		EndSelect
		$sResult &= $VarISOArr[$i] 
	Next
	Return $sResult 
EndFunc ; ==> _ISO2WIN
 
Автор
L

Latoid

Знающий
Сообщения
95
Репутация
11
UTF -> 1251
Код:
Func _UTF2WIN ($String)
	Local $sResult = "", $iCode 
	Local $VarUTFArr = StringSplit($String, "")
	For $i = 1 to $VarUTFArr[0]
		$iCode = AscW($VarUTFArr[$i])
		Select
			Case $iCode >=1040 And $iCode <= 1103
				$VarUTFArr[$i] = Chr ($iCode - 848)
			Case $iCode = 1025
				$VarUTFArr[$i] = Chr (168)
			Case $iCode = 1105
				$VarUTFArr[$i] = Chr (184)
			Case $iCode = 8470
				$VarUTFArr[$i] = Chr (185)
		EndSelect
		$sResult &= $VarUTFArr[$i] 
	Next
	Return $sResult 
EndFunc ; ==> _UTF2WIN
 
Верх