Deutsches AutoHotkey Homepage AutoHotkey Community
Wir helfen uns gegenseitig aus der Patsche
 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Unicode Chars / darstellen, eingeben und mit AHK verarbeiten

 
Neues Thema eröffnen   Neue Antwort erstellen    AutoHotkey Community Foren-Übersicht -> Skripte & Funktionen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
DerRaphael



Anmeldedatum: 09.01.2008
Beiträge: 883
Wohnort: Zuhause

BeitragVerfasst am: Do Apr 24, 2008 9:25 pm    Titel: Unicode Chars / darstellen, eingeben und mit AHK verarbeiten Antworten mit Zitat

Hallo,

für alle, die Bedarf haben mit Autohotkey Unicodezeichen darstellen zu müssen (wollen) und bisher daran scheiterten, dass AHK das nativ nicht kann: hier mal eine kleine Lösung, die zeigt wie sowas dennoch möglich ist.

Ein paar Beispielzeichen für Japanisch:
イントロダクション

Hier mal ein paar kyrillische Zeichen:
И дополнение на русском.

So sieht das dann Im Script aus:



Hier das Script:
Code:

;~ Unicode Input and Display Test
#NoEnv
   Gui, Font,s10, Arial Unicode MS
   Gui, Add, Edit, w400 hwndEditHWnd gUpdateMe r1,
   Gui, Add, text, hwndStaticHWND w400,`n
   Gui, Show
return

GuiClose:
GuiEscape:
   ExitApp
   
UpdateMe:
   GetUnicodeText(wString,EditHWnd)
   SetUnicodetext(wString,StaticHWND)
;    UTF8 := Unicode2UTF8(wString) ; This is usefull for working with filters like RegEx or StringReplace
   Gui, Show
return

;~    This works only with single Lined Edit Controls
GetUnicodeText(ByRef wString, hWnd)
{
   static EM_GETLINELENGTH := 0xC1, EM_GETLINE := 0xC4
   length := DllCall("SendMessageW", "UInt",hWnd, "UInt",EM_GETLINELENGTH, "UInt",0, "Uint",0)
   VarSetCapacity(wString,length*2+1,0)
   NumPut(length,wString,"Uint")
   result := DllCall("SendMessageW", "UInt",hWnd, "UInt",EM_GETLINE, "UInt",0,"Uint",&wString)
}

SetUnicodetext(ByRef ptrUnicodeText,hWnd)
{
   static WM_SETTEXT := 0x0C
   DllCall("SendMessageW", "UInt",hWnd, "UInt",WM_SETTEXT, "UInt",0, "Uint",&ptrUnicodeText)
}

Unicode2UTF8(ByRef wString)
{
   nSize := DllCall("WideCharToMultiByte","Uint",65001,"Uint",0,"Uint"
      ,&wString,"int",-1,"Uint",0,"int",0,"Uint",0,"Uint",0)
   VarSetCapacity(sString, nSize)
   DllCall("WideCharToMultiByte","Uint",65001,"Uint",0,"Uint"
      ,&wString,"int",-1,"str",sString,"int",nSize,"Uint",0,"Uint",0)
   Return sString
}


Das Script 'liest' über die WideChar Sendmessage [SendMessageW] methode (autohotkey verwendet lediglich das normale SendMessage intern) das Editcontrol aus (angesprochen über dessen hWnd) und setzt mittels einer weiteren hWnd diesen Text wieder in ein Static Control - also ein leergelassenes Textfeld.

Wichtig: Für die richtige Darstellung wird der Font Arial Unicode MS benötigt (ist eigentlich bei jedem Windows vorhanden) - andere Fonts haben nicht alle notwendigen Zeichen und stellen dann nur Platzhalter dar.

Die Funktionalität lässt sich auf jedenfall weiter ausbauen - hier ist es erstmal als Techdemo angedacht, damit jeder mal sehen kann, dass Unicode kein Hexenwerk ist und AHK sehr wohl damit umgehen kann.

Interessant wird es, wenn man UTF-8 kodierte Texte einlesen möchte um diese mittels StringReplace oder RegEx Funktionen weiter zu bearbeiten:

Dafür ist die Zeile auskommentierte UTF8 Variable gedacht. In ihr wird das entsprechende UTF8 Codierte Pendant gespeichert, so dass dieses direkt für Dateiinhalts aktionen genutzt werden kann.

Mein Dank geht an:
PhiLho hat eine Funktion im Mutterforum vorgestellt [Link], wie UTF8 kodierte Texte geschrieben und gelesen werden können, an anderer Stelle demonstriert, wie Kanji Zeichen (jap. Schriftzeichen) in Autohotkey dargestellt werden können [Link]. Für die Idee, der Unicode nach UTF8 Transformation brachte mich Sean, der in seinen unzähligen COM Scripten auch einen codepageConverter bereitgestellt hatte [Link]. Leider fehlte diese genau die Funktion Smile


Getestet habe ich das Script unter Windows Vista mit Autohotkey 1.0.47.06
EDIT: Ich habe das Script auch mit Win2K (ahk 1.0.47.05) getestet - da wird nur eine editbox angezeigt und in dieser ein Haufen Fragezeichen. Ich werde mal nachschlagen, wie man eine EditControl UniCode fähig bekommt.

es grüßt euch
derRaphael
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Thalon



Anmeldedatum: 25.10.2005
Beiträge: 1871
Wohnort: Österreich

BeitragVerfasst am: Fr Apr 25, 2008 8:57 am    Titel: Antworten mit Zitat

Zitat:
Wichtig: Für die richtige Darstellung wird der Font Arial Unicode MS benötigt (ist eigentlich bei jedem Windows vorhanden) - andere Fonts haben nicht alle notwendigen Zeichen und stellen dann nur Platzhalter dar.
Genau genommen wird einfach ein Unicode-Font benötigt Wink
Ob das jetzt Arial Unicode, Arial Unicode Standard, Arial Unicode, MS Standard, Thorndale, Batang, Dotum, Simsun usw ist ist eher ziemlich egal Wink
Ich habe hier immerhin über 20 Unicode-Fonts installiert... Smile


Wird dabei auch auf die Rechts-nach-Links-Schreibweise für Hebräisch automatisch Rücksicht genommen oder muss man quasi verkehrt herum schreiben?

Thalon
_________________
Mein Motto: Hilfe zur Selbsthilfe!
Teildeutsche Hilfe (CHM)!! und Deutsche Online-Hilfe
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
haichen



Anmeldedatum: 10.06.2007
Beiträge: 87

BeitragVerfasst am: Fr Apr 25, 2008 10:52 am    Titel: Antworten mit Zitat

Ich habe ein paar Funktionen geschrieben, mit denen on the Fly die komplette Sprache einer Applikation ändern kann. Kann man schön mit Kronomium ausprobieren (funktioniert auch ohne CMOSTimer).
Menüs, Texte, ToolTips - alles was man als Variable nutzen kann. Die Texte hole ich mir dabei aus einer Ini-Datei oder aus einer Variable, die wie eine Ini-Datei aufgebaut ist. Dort steht dann zB.
Varirgendwas= Übersetzung

Ich überlege Dank Deines Beitrags ob ich meine Funktionen vielleicht erweitere.
Meine Frage ist, ob es wohl Sinn macht, die Übersetzungen in so einer ini-Datei zu speichern und wenn ja in welchem Format, als Bin oder als Hex?

Varirgendwas= fffef330c830ed30c030af30b730e730f330
Varirgendwas= ÿþ¤0ó0È0í0À0¯0·0ç0ó0

Und wenn Hex, wie gehts? Das bekomme ich leider nicht hin (trotz bin2hex() ).
Würde mich freuen Eure Meinung zu hören.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
derRaphael (nli)
Gast





BeitragVerfasst am: Fr Apr 25, 2008 11:34 am    Titel: Antworten mit Zitat

hallo haichen!

du solltest hex2bin verwenden (was du bestimmt meintest) lt PhiLho kann dann dieser binärtext an ein Element übermittelt werden, das eine hWnd hat.
wenn der text vorher als UTF-8 gespeichert wurde (autohotkey ignoriert ja die BOM) muss die Ini vorher darauf überprüft werden und eine interne UTF8 nach Unicode konvertierung stattfinden.

Wenn du also bei einem Menüeintrag etwas ändern möchtest, musst du genau diesen ansprechen können. das beispiel, was ich hier gebracht habe funktioniert mit Static Controls (da jene eine eigene hWnd haben)

mittlerweile habe ich herausgefunden, wieso es in win2000 nicht funktioniert. die einzelnen Controls scheinen jeweils mit CreateWindow statt mit CreateWindowW erstellt zu werden. Letzteres erlaubt Unicodezeichen. Ersteres nicht (zumindest bei älteren Versionen). Auf MSDN wurde explizit darauf hingewiesen. Im Augenblick arbeite ich an einer Lösung, die Unicodes innerhalb einer Listview erlaubt, jedoch wie es scheint müssen Änderungen an Autohotkeys Source gemacht werden oder alle Funktionen, die GUIs abbilden nachgebaut werden. (In der Source CreateWindowW, SendMessageW und PostMessageW zu verwenden erscheint mir einfacher als aller umzustricken, damit eigene Controls gebaut werden können, deren Syntax lediglich nur an Autohotkey angelehnt ist und nicht den Komfort der eingebauten funktionen bietet.

ich bleibe am ball!

es grüßt euch
derRaphael
Nach oben
derRaphael (nli)
Gast





BeitragVerfasst am: Fr Apr 25, 2008 11:38 am    Titel: Antworten mit Zitat

haichen hat Folgendes geschrieben:
Und wenn Hex, wie gehts? Das bekomme ich leider nicht hin (trotz bin2hex() ).
Würde mich freuen Eure Meinung zu hören.


bei philhos kanji link (der zweite oben) werden hex darstellungen verwendet. je nachdem kodierung als basis verwendet wurde muss ggf nach UTF-16 / Unicode transformiert werden.
Nach oben
haichen



Anmeldedatum: 10.06.2007
Beiträge: 87

BeitragVerfasst am: Fr Apr 25, 2008 12:41 pm    Titel: Antworten mit Zitat

Ja, das ist noch ein bißchen ein Buch mit sieben Siegeln.
Ich kann wohl dank dieser Funktionen einen binären oder hex Code anzeigen lassen, aber wie wandel ich zB. japanische Schriftzeichen in speicherbaren Text (hex oder bin ?) um. Das war wohl meine Frage.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
derRaphael (nli)
Gast





BeitragVerfasst am: Fr Apr 25, 2008 3:22 pm    Titel: Antworten mit Zitat

Code:
;~ Unicode Input and Display Test

; Hex2Bin / Bin2Hex by PhiLho
; http://file.autohotkey.net/PhiLho/DllCallStruct.ahk
#Include DllCallStruct.ahk

#NoEnv
   Gui, Font,s10, Arial Unicode MS
   Gui, Add, Edit, w400 hwndEditHWnd r1,
   Gui, Add, button, wp gShowMe,ShowDaHex
   Gui, Show
return

GuiClose:
GuiEscape:
   ExitApp
 
ShowMe:
   Hex := "", nString := ""
   GetUnicodeText(wString,EditHWnd)
   ConvertedChars := Bin2Hex(hex,wString)
   MsgBox % "Der HEX code lautet: `n`n" hex
   ConvertesChars := Hex2Bin(nString,hex)
   Gui, Destroy
   Gui, Font,s10, Arial Unicode MS
   Gui, Add, text, hwndTST, w400, BLAH BLUP
   Gui, Show,
   SetUnicodetext(nString,TST)
return

;~    This works only with single Lined Edit Controls
GetUnicodeText(ByRef wString, hWnd)
{
   static EM_GETLINELENGTH := 0xC1, EM_GETLINE := 0xC4
   length := DllCall("SendMessageW", "UInt",hWnd, "UInt",EM_GETLINELENGTH, "UInt",0, "Uint",0)
   VarSetCapacity(wString,length*2+1,0)
   NumPut(length,wString,"Uint")
   result := DllCall("SendMessageW", "UInt",hWnd, "UInt",EM_GETLINE, "UInt",0,"Uint",&wString)
}


Das Script basiert auf dem ersten, es lässt Dich eine Eingabe machen, zeigt den Hexwert an, und reconvertiert diesen Hexwert so, dass er wieder angezeigt werden kann.

Getestet mit Vista.

Grüße
DerRaphael
Nach oben
derRaphael (nli)
Gast





BeitragVerfasst am: Fr Apr 25, 2008 3:27 pm    Titel: Antworten mit Zitat

Thalon hat Folgendes geschrieben:
Wird dabei auch auf die Rechts-nach-Links-Schreibweise für Hebräisch automatisch Rücksicht genommen oder muss man quasi verkehrt herum schreiben?


AFAIK muss dem darzustellenden Fenster ein spezieller Style übermittelt werden (User MsgBox hatte in seinem Footer mal sowas drinstehen dass eine Message box 'andersrum' dargestellt wurde)
Nach oben
haichen



Anmeldedatum: 10.06.2007
Beiträge: 87

BeitragVerfasst am: Fr Apr 25, 2008 5:23 pm    Titel: Antworten mit Zitat

Wunderbar.. genau so etwas hatte ich mir gedacht.

Vielen Dank
haichen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
haichen



Anmeldedatum: 10.06.2007
Beiträge: 87

BeitragVerfasst am: Fr Apr 25, 2008 7:10 pm    Titel: Antworten mit Zitat

Hier mal eine kleine unicode version von langhelp. An der include Datei hat sich nichts geändert.
Includes:
BinaryEncodingDecoding von PhiLho
LangHelp von mir

Unicode Bsp:
langmini

In diesem Fall sind alle Texte in der Variablen IniVar vorgegeben. Wie man leicht erkennt kann man dies auch mit readfile machen. Die Menüs kann ich aber wohl noch nicht in unicode übersetzen oder haben die auch ein hwnd?


Zuletzt bearbeitet von haichen am Sa Apr 26, 2008 12:21 am, insgesamt 2-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
derRaphael (nli)
Gast





BeitragVerfasst am: Fr Apr 25, 2008 8:08 pm    Titel: Antworten mit Zitat

soweit ich weiß, haben einzelne menüelemente keine hwnd, da muß man anders herangehen, ähnlich wie bei ListView / TreeView / ComboBox / DDL
diese Elemente unterliegen einer weitern Struktur, die zwar änderbar ist, jedoch muss man den Aufbau der selbigen kennen. im einzelfall bedeutet es die AHK funktionen für jeden einzelfall nachzubauen. wie bereits geschrieben, an einer umsetzung für ListView Elemente bin ich bereits dran.

BTW: WindowsXP wurde ebenfalls getestet und funktioniert einwandfrei.

Für eine l10n Version von Software, muss diese also mindestens unter winXP laufen, da beispielsweise bei windows2000 die routinen für unicode zwar existieren, jedoch nicht von AHK nativ verwendet werden. bei winxp und jünger biegt das betriebssystem entsprechende anfragen um (oder ist gleich unicode fähig und nennt sich nur anders - k.a.; es geht jedenfalls)

grüße
derRaphael
Nach oben
haichen



Anmeldedatum: 10.06.2007
Beiträge: 87

BeitragVerfasst am: Sa Apr 26, 2008 1:12 am    Titel: Antworten mit Zitat

Ich hab hier noch ein Gif von meiner Testversion für meine LanguageHelper Funktionen auf unicode.


Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    AutoHotkey Community Foren-Übersicht -> Skripte & Funktionen Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de