Что нового

[Данные, строки] Помогите, нужно чтобы прога поддерживала китайскую и казахскую кодировку.

NRJKZ

Новичок
Сообщения
4
Репутация
0
Версия AutoIt: 3.

Описание: Утилита создает текстовый файл и копирует в него выделенный мышкой текст из любых приложений. С этим она справляется. Но не правильно копирует тексты на казахском языке. На русском и английском все стабильно. Вместо таких специфичных казахских букв как ә і ң ғ ү ұ қ ө, появляются вопросительные знаки (?).

И еще такая ситуация с китайским, арабским, и др., но они не сильно важны.

Вот например: Саумал желі ?ара?ай басын ыр?а?ан сал?ын т?н.

вместо Саумал желі қарағай басын ырғаған салқын түн.
-------------------------------------------------------------------------
Вот сайт с которого нужно к примеру скопировать текст с Monitor Text Selection http://ikitap.kz/book/koishybek_mybarak_kybyzhyk/files/assets/basic-html/page2.html
------------------------------------------------------------------------
Сама программа с исходниками http://autoit-script.ru/index.php?action=downloads;sa=view;down=17

Спасибо всем за помощь чайнику.

Примечания:
Код:
#NoTrayIcon
#include <Constants.au3>
#include <Misc.au3>
#include <MouseSetOnEvent_UDF.au3>
;

Opt("TrayMenuMode", 1)
TraySetIcon("shell32.dll", -135)
TraySetClick(16)
TraySetState()

$CopyUseSelection_TrayItem = TrayCreateItem("Копировать по выделению")
TrayItemSetState(-1, $TRAY_CHECKED)

$SwitchMonitoring_TrayItem = TrayCreateItem("Мониторинг выделения включён")
TrayItemSetState(-1, $TRAY_CHECKED)

TrayCreateItem("")

$Exit_TrayItem = TrayCreateItem("Выход")

Global $sCopy_HotKey = "^+c"
Global $sToggleScriptPause_HotKey = "^+p"
Global $sExit_HotKey = "^+e"

Global $iMouse_X_Position = MouseGetPos(0)
Global $iSelected = False
Global $iPaused = True

Global $sFile = @ScriptDir & "\SelectedText.txt"

HotKeySet($sExit_HotKey, "_Quit")
HotKeySet($sToggleScriptPause_HotKey, "_SwitchMonitoring_Proc")

_SwitchMonitoring_Proc()

While 1
	Switch TrayGetMsg()
		Case $TRAY_EVENT_PRIMARYUP, $SwitchMonitoring_TrayItem
			_SwitchMonitoring_Proc()
		Case $CopyUseSelection_TrayItem
			If TrayItemGetState($CopyUseSelection_TrayItem) = 65 Then
				_SetMouseEvent_Proc(1)
				HotKeySet($sCopy_HotKey)
			Else
				_SetMouseEvent_Proc(0)
				HotKeySet($sCopy_HotKey, "_CopyUseHotkey_Proc")
			EndIf
		Case $Exit_TrayItem
			_Quit()
	EndSwitch
	
	If $iSelected Then
		$iSelected = False
		$sSelection = _GetSelectedText()
		If $sSelection <> "" Then FileWriteLine($sFile, $sSelection & @CRLF & @CRLF)
	EndIf
WEnd

Func MousePrimaryDown_Event()
	$iMouse_X_Position = MouseGetPos(0)
EndFunc

Func MousePrimaryUp_Event()
	If $iMouse_X_Position <> MouseGetPos(0) Then $iSelected = True
EndFunc

Func _GetSelectedText()
	Local $sSelected_Data
	
	;This one is crashing the script :(
;~ 	Local $hWnd = WinGetHandle("")
;~ 	Local $sCtrlClass = ControlGetFocus($hWnd)
;~ 	
;~ 	If Not StringInStr($sCtrlClass, "Scintilla") Then
;~ 		$sSelected_Data = ControlCommand($hWnd, "", $sCtrlClass, "GetSelected")
;~ 		If IsString($sSelected_Data) Then Return $sSelected_Data
;~ 	EndIf
	
	Local $sOld_Clipboard_Data = ClipGet()
	
	ClipPut("")
	Send("^{INS}")
	$sSelected_Data = ClipGet()
	ClipPut($sOld_Clipboard_Data)
	
	Return $sSelected_Data
EndFunc

Func _CopyUseHotkey_Proc()
	$iSelected = True
EndFunc

Func _SwitchMonitoring_Proc()
	$iPaused = Not $iPaused
	
	If $iPaused Then
		TrayItemSetText($SwitchMonitoring_TrayItem, "Мониторинг выделения выключен")
		TrayItemSetState($SwitchMonitoring_TrayItem, $TRAY_UNCHECKED)
		TraySetIcon("shell32.dll", -66)
		
		_SetMouseEvent_Proc(0)
	Else
		TrayItemSetText($SwitchMonitoring_TrayItem, "Мониторинг выделения включен")
		TrayItemSetState($SwitchMonitoring_TrayItem, $TRAY_CHECKED)
		TraySetIcon("shell32.dll", -135)
		
		_SetMouseEvent_Proc(1)
	EndIf
EndFunc

Func _SetMouseEvent_Proc($iSet = 1)
	If $iSet = 1 And TrayItemGetState($CopyUseSelection_TrayItem) = 68 Then Return 0
	
	Switch $iSet
		Case 1
			_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT, "MousePrimaryDown_Event", "", "", 0, 0)
			_MouseSetOnEvent($MOUSE_PRIMARYUP_EVENT, "MousePrimaryUp_Event", "", "", 0, 0)
		Case Else
			_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT)
			_MouseSetOnEvent($MOUSE_PRIMARYUP_EVENT)
	EndSwitch
EndFunc

Func _Quit()
	_SetMouseEvent_Proc(0)
	Exit
EndFunc
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Если ваша программа не будет поставляться массово, то может быть вам установить дополнительные языки в "настройки языков и региональных стандартов"
 

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
NRJKZ [?]
создает текстовый файл и копирует в него
Попробуйте открыть файл в режиме UTF16 LE. Для этого замените строку
Код:
Global $sFile = @ScriptDir & "\SelectedText.txt"
на
Код:
Global $sFile = FileOpen(@ScriptDir & "\SelectedText.txt", 1 + 32)


А в функции _Quit() перед Exit добавьте
Код:
FileClose($sFile)
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
NRJKZ
К примеру я копирую текст с арабского сайта на арабском языке, у меня в буфере одни [/s]
Код:
??????
потому что система имеет только 2 языка английский и русский. Чтобы другие языки поддерживались, как сказано выше добавь казахский язык в панели управления -> "Язык и региональные стандарты" (на WinXP так называется) (я не уверен, но так думаю).
 

sims

Осваивающий
Сообщения
184
Репутация
24
AZJIO [?]
система имеет только 2 языка английский и русский. Чтобы другие языки поддерживались, как сказано выше добавь казахский язык в панели управления -> "Язык и региональные стандарты"
Не думаю что это поможет.

Для того чтобы все получилось, нужна поддержка юникода AutoItом.
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
sims [?]
Для того чтобы все получилось, нужна поддержка юникода AutoItом.
AutoIt является юникодной версией уже давно. Есть файлы .nlc (если не ошибаюсь), которые содержат символы в диапазоне 128-256, которые для каждой страны свои. Как я понимаю эти диапазоны загружаются в память и система поддерживает их использование. Иначе почему при копировании любого иного текста у меня в буфере вопросы... при чём я про AutoIt не говорил, я говорил про буфер обмена.

Переключил Notepad++ в UTF8, тогда вставился арабский текст. Итог окно, куда текст вставляется должен поддерживать юникод.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,485
NRJKZ [?]
Утилита создает текстовый файл и копирует в него выделенный мышкой текст из любых приложений. С этим она справляется. Но не правильно копирует тексты на казахском языке
Копирует правильно, просто запись делается в ANSI.
Я поправил утилиту, обновил библиотеку MouseOnEvent, добавил небольшую паузу в механизм получения текста (для надёжности), и сделал запись в файл в UTF-8.
 
Верх