[solved] String Länge bei Unicode Zeichen

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
bichlepa
Posts: 183
Joined: 15 Aug 2014, 06:44
Location: Germany
Contact:

[solved] String Länge bei Unicode Zeichen

24 May 2017, 15:10

In meinem neuen Unicode Enter Skript gibt es einen Bug, den ich nicht zu beheben weiß.

Ich muss bei einem String wissen, wie oft man Backslash drücken muss, um den String zu löschen. Eigentlich sollte es über strlen() gehen. Aber es liefert bei manchen Unicode Zeichen unerwarteterweise den Wert 2.

Beispiel:
Image Sieht gut aus.
Image Warum Länge 2?

Das kann man mit diesen drei Dateien selbst nachvollziehen (in einen gleichen Ordner herunterladen und Skript starten):
https://www.dropbox.com/s/awvsuddyordfkic/test.ahk?dl=1
https://www.dropbox.com/s/n8iks1d4spcbp ... 1.txt?dl=1
https://www.dropbox.com/s/bzpiy7iazuy6w ... 2.txt?dl=1

Warum ist das so? Ich vermute, es hat etwas mit dem Character Code zu tun. Wie kann ich die tatsächliche Länge eines Strings ermitteln, welches solche Unicode-Zeichen enthält, um zu wissen, wie oft man Backslash drücken muss, um den String wieder zu löschen?
Last edited by bichlepa on 25 May 2017, 13:08, edited 1 time in total.
Scripting is too complicated? Try AutoHotFlow, the graphical automation tool! Written in AutoHotkey.
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: String Länge bei Unicode Zeichen

24 May 2017, 17:02

Habe heute mit ascii herum gespielt. Ohne viel über die materie zu wissen - wird in dem von dir geschilderten beispiel evtl die anzahl der stellen > "dreistellig" gezählt??
User avatar
bichlepa
Posts: 183
Joined: 15 Aug 2014, 06:44
Location: Germany
Contact:

Re: String Länge bei Unicode Zeichen

25 May 2017, 06:46

BoBo wrote:wird in dem von dir geschilderten beispiel evtl die anzahl der stellen > "dreistellig" gezählt??
Was meinst du damit❔
Scripting is too complicated? Try AutoHotFlow, the graphical automation tool! Written in AutoHotkey.
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: String Länge bei Unicode Zeichen

25 May 2017, 11:30

Um das ganze zu verstehen muss man Unicode verstehen. ( die Utf-x codierung )
AutoHotkey verwendet eine Utf-16 Encodierung. In dieser Encodierung ist jeder sogenannte Codepoint 16 bits lang, ABER ein Zeichen kann aus mehreren Codepoints bestehen.
Was AutoHotkey macht beim StrLen Befehl ist die Codepoints zu zählen.
Da ab Zeichen einer gewissen Größenordnung 2 Codepoints brauchen braucht, gibt AutoHotkey dann die Nummer 2 zurück.

Ich bin Normalerweise gegen Youtube tutorials aber dieses Video beschreibt es wirklich gut:


Ich finde man sollte dieses Verhalten ändern.
Recommends AHK Studio
User avatar
bichlepa
Posts: 183
Joined: 15 Aug 2014, 06:44
Location: Germany
Contact:

Re: String Länge bei Unicode Zeichen

25 May 2017, 12:44

Danke für das Video. Es ist wirklich informativ!
Das Verhalten sollte man wirklich ändern. Bei einem loop,parse taucht das gleiche Problem auf. Manche Unicode Zeichen werden wie zwei behandelt.
Scripting is too complicated? Try AutoHotFlow, the graphical automation tool! Written in AutoHotkey.
User avatar
bichlepa
Posts: 183
Joined: 15 Aug 2014, 06:44
Location: Germany
Contact:

Re: String Länge bei Unicode Zeichen

25 May 2017, 13:00

Ich habe jetzt mit dem neuen Wissen weitergeforscht und gefunden, dass im Programm die großen Unicode Zeichen in sogenannten Surrogates repräsentiert werden.
https://msdn.microsoft.com/de-de/librar ... s.85).aspx
Ich konnte mit dem Wissen ein Workaround finden.
Statt strlen() verwende ich jezt diese Funktion:

Code: Select all

new_strlen(newstrlen_string)
{
	newstrlen_length:=0
	loop,parse,newstrlen_string
	{
		newstrlen_length++
		Transform,newstrlen_charnumber,asc,%A_LoopField%
		if (newstrlen_charnumber >= 0xDC00 && newstrlen_charnumber <= 0xDFFF)
			newstrlen_length--
	}
	return newstrlen_length
}
Scripting is too complicated? Try AutoHotFlow, the graphical automation tool! Written in AutoHotkey.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 103 guests