Forenindex » Programme » Print/Bildbearbeitung » Adobe InDesign Skriptwerkstatt » decodeunicode U+1D538

decodeunicode U+1D538

Martin Fischer
  
Beiträge gesamt: 12783

21. Apr 2021, 08:36
Bewertung:

gelesen: 8297

Beitrag als Lesezeichen
Um den Hexadezimalwert (Unicode) eines Zeichens zu ermitteln, verwende ich folgende einfache Routine:

Code
var str = 'A'; 
var val = str.charCodeAt(0);
var uni = val.toString(16).toUpperCase();
$.writeln(uni);


=> 41

Bei Bedarf wird vorne mit Nullen aufgefüllt und 'U+' ergänzt.


Nun bin ich auf Zeichen gestoßen, bei denen der Unicodewerte so nicht ermittelt werden kann: https://decodeunicode.org/en/u+1D538

Die obige Routine liefert D835.
Das ist falsch.
Dieses Zeichen gibt es nicht: https://decodeunicode.org/en/u+D835

Der erwartete Wert ist vielmehr (fünfstellig) 1D538.

Wie ist dieser Wert zu ermitteln?

Viele Grüße
Martin


decodeunicode U+1D538

WernerPerplies
Beiträge gesamt: 2762

21. Apr 2021, 09:11
Bewertung:

gelesen: 8281

Beitrag als Lesezeichen
Moin Herr Fischer,

Vielleicht hilft Dieser Link:
https://www.compart.com/de/unicode/U+1D538

Der von Ihnen gewünschte Code kommt aus dem UTF32 Bereich.

Probieren Sie es mal hiermit:
Code
String.prototype.fill = function(number){var filled ="";for (var i=0;i<number;++i){filled += this;}return filled;} 
String.prototype.padLeft = function(fillc, length)
{if (this.length<length){return (fillc.fill(length-this.length)+this).substr(-length);}return this;}
Number.prototype.padLeft = function(fillc, length)
{return this.toString().padLeft(fillc, length);}
/*string*/ String.prototype.bytesToHexCode=function()
{
var hexString = "";
for (var i=0; i < this.length; i++)
{
hexString += this.charCodeAt(i).toString(16).toUpperCase().padLeft("0",2);
}
return hexString;
}


"IhrCode".bytesToHexCode()

Im ESTK sieht das dann so aus:
Code
"\u1D538".bytesToHexCode() 
Ergebnis: 1D5338

Ergänzt:
Alternativ habe ich aauch nuch die Routine:
Code
/*string*/ String.prototype.toUnicode=function()  
{
var unicodeString = '';
for (var i=0; i < this.length; i++)
{
var unicode = "\\u" + this.charCodeAt(i).toString(16).toUpperCase().padLeft("0",4);
unicodeString += unicode;
}
return unicodeString;
}


Verwenden Sie bitte die gleichen Includes:

In der ESTK-Konsole sieht das dann so aus:

Code
"&#7507;8".toUnicode() 
Ergebnis: \u1D53\u0038


Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen

(Dieser Beitrag wurde von WernerPerplies am 21. Apr 2021, 09:30 geändert)

decodeunicode U+1D538

Martin Fischer
  
Beiträge gesamt: 12783

21. Apr 2021, 09:46
Bewertung:

gelesen: 8267

Beitrag als Lesezeichen
Guten Morgen Herr Perplies,

vielen Dank für Ihre Unterstützung.

Antwort auf: Der von Ihnen gewünschte Code kommt aus dem UTF32 Bereich.


Dies hatte ich schon halb befürchtet.
Möglicherweise bedarf es deswegen auch noch einer Überprüfung, ob der Wert eines Zeichens mit dem Code aus dem UTF16- oder dem UTF32-Bereich dargestellt werden muß.


Allerdings führen beide Varianten noch nicht zu dem gewünschten Ziel.
(In den Codebeispielen verwende ich »A«, weil das spezielle Zeichen A mit dem Doppelstrich hier nicht dargestellt werden kann.)

Code
var str = 'A'; 
uni = str.bytesToHexCode();
$.writeln(uni);
// => D835DD38


Das entspricht dem UTF-16 HEX Value 0xD835DD38 in https://decodeunicode.org/en/u+1D538

Ich benötige jedoch »U+1D538«.
Das »1D538« steckt im UTF-32 HEX Value 0x0001D538.

Code
var str = 'A'; 
uni = str.toUnicode();
$.writeln(uni);
// => \uD835\uDD38



Wieso erhalte ich für das eine auszuwertende Zeichen ein kombiniertes Ergebnis?
Der Zielwert wäre »\u1D538« (so wie in der Glyphenpalette angegeben und bei dedoceunicode.org hinterlegt) statt »\uD835\uDD38«.

Viele Grüße
Martin Fischer

(Dieser Beitrag wurde von Martin Fischer am 21. Apr 2021, 09:47 geändert)

decodeunicode U+1D538

WernerPerplies
Beiträge gesamt: 2762

21. Apr 2021, 09:57
Bewertung:

gelesen: 8254

Beitrag als Lesezeichen
Hallo Herr Fischer,

Ich weiß nicht, ob ich Ihr Problem richtig verstanden habe, Ihr Beispiel sieht bei mir im ESTK so aus:
Code
"\u1D538" 
Ergebnis: &#7507;8 -> Darstellungsproblem
"\u1D538".bytesToHexCode()
Ergebnis: 1D5338


Und das ist doch das, was Sie wollen, oder?

Die Unicode-Routine bildet UTF16-Code ab.
Code
"\u1D538".toUnicode() 
Ergebnis: \u1D53\u0038

Dass sind dann zwei Bytes.
Bei UTF8 sieht es dann noch einmal anders aus.

Hier gibt es naoch weitere Informationen:
https://dmitripavlutin.com/...-know-about-unicode/

Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen

(Dieser Beitrag wurde von WernerPerplies am 21. Apr 2021, 10:07 geändert)

decodeunicode U+1D538

WernerPerplies
Beiträge gesamt: 2762

21. Apr 2021, 10:42
Bewertung:

gelesen: 8201

Beitrag als Lesezeichen
Hallo Herr Fischer,

sorry, aber ich bin da einem Trugschluss aufgesessen,
"\u1D538".toUniCode() kann nur UTF16-Codes abbilden, d.h. ""\u1D53" +"8".

Sie müssten also vermutlich immer mit zwei Bytes arbeiten:
"surrogate pairs"

Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen

decodeunicode U+1D538

WernerPerplies
Beiträge gesamt: 2762

21. Apr 2021, 11:08
Bewertung:

gelesen: 8177

Beitrag als Lesezeichen
Hallo Herr Fischer,

ein letztes Mal zu diesem Thema von mir :-)

Hier gibt es Einiges zu diesem Thema:
https://stackoverflow.com/...ecimal-in-javascript

z. B:
Code
alert(decimalToHex(0x1D538)); 
function decimalToHex(d, padding) {
var hex = Number(d).toString(16);
padding = typeof (padding) === "undefined" || padding === null ? padding = 2 : padding;

while (hex.length < padding) {
hex = "0" + hex;
}

return hex;
}


Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen

decodeunicode U+1D538

Martin Fischer
  
Beiträge gesamt: 12783

21. Apr 2021, 11:46
Bewertung:

gelesen: 8162

Beitrag als Lesezeichen
Antwort auf: Ergebnis: 1D5338

Und das ist doch das, was Sie wollen, oder?


Nein, ich wollte 1D538.
Aber ich bekomme D835DD38.

Laut https://stackoverflow.com/...f-character-is-32bit wäre codePointAt() der richtige Befehl, um den ganzen 32bit Code zu erhalten. Aber der wirft bei mir einen Fehler:

Zitat Runtime Error: Error Code# 24: chr.codePointAt is not a function



Auch die Angebote in https://stackoverflow.com/...nicode-string-to-hex führten bislang nicht zum Ziel.



Soeben habe ich eine Lösung in https://stackoverflow.com/...oredirect=1&lq=1 entdeckt:

Code
function emojiUnicode (emoji) { 
var comp;
if (emoji.length === 1) {
comp = emoji.charCodeAt(0);
}
comp = (
(emoji.charCodeAt(0) - 0xD800) * 0x400
+ (emoji.charCodeAt(1) - 0xDC00) + 0x10000
);
if (comp < 0) {
comp = emoji.charCodeAt(0);
}
return comp.toString("16");
};


=> 1d538

Aber das funktioniert nur mit 32 bit Zeichen. Ein einfaches "A" gibt NaN zurück.
Das wäre allerdings abzufangen.

Zumindest mal ein Ansatz.

Viele Grüße
Martin


decodeunicode U+1D538

Martin Fischer
  
Beiträge gesamt: 12783

21. Apr 2021, 11:52
Bewertung:

gelesen: 8150

Beitrag als Lesezeichen
Antwort auf: ein letztes Mal zu diesem Thema von mir :-)


Das von Ihnen zitierte Schippsel liefert bei der Auswertung dieses »As mit dem Doppelstrich« auch nur ein NaN.

Mit »alert(decimalToHex(0x1D538));« funktioniert es. Aber wenn ich 1D538 schon kennen würde, müsste ich es nicht nochmal auswerten. :-)
Ich habe aber nur das A mit dem Doppelstrich.


Bislang ist die emojiUnicode-Funktion am nächsten dran.

Viele Grüße
Martin



(Dieser Beitrag wurde von Martin Fischer am 21. Apr 2021, 11:54 geändert)

decodeunicode U+1D538

WernerPerplies
Beiträge gesamt: 2762

21. Apr 2021, 13:36
Bewertung:

gelesen: 8090

Beitrag als Lesezeichen
Hallo Herr Fischer,

als doch noch mal!
Zitat Das von Ihnen zitierte Schippsel liefert bei der Auswertung dieses »As mit dem Doppelstrich« auch nur ein NaN.

Die Routine macht schon genau das was sie soll, aber nicht das, was Sie wirklich wollen.

Code
str.charCodeAt(0) 

liefert immer einen 16-Bitwert zurück und mehr nicht.

Was Sie vermutlich in Wirklichkeit suchen, ist die Codierung, die Sie benötigen, um ein Zeichen aus einem Bereich > 16-Bit auszugeben.

Das dürfte auf jeden Fall ein 2*16-Bitcode sein, binär also vier Bytes.

Damit das funktioniert, müssen sie also entweder einen Algorithmus für die Umwandlung finden, oder alternativ eine Mappingtabelle erzeugen.

Falls InDesign so etwas überhaupt kann, würde ich die Aufgabe so lösen:

Einen Textrahmen mit den Glyphen der geünschten Zeichen erzeugen und anschließend das Contents-Property des Rahmens analysieren.

Daraus kann man dann entweder den Algorithmus erkennen oder aber einfacher, aber mit Arbeit verbunden, eine Mappingtabelle erstellen.

Ich hoffe, dass meine Erklärung verständlich ist.

Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen

decodeunicode U+1D538

Martin Fischer
  
Beiträge gesamt: 12783

21. Apr 2021, 14:36
Bewertung:

gelesen: 8070

Beitrag als Lesezeichen
Wie oben geschrieben funktioniert es mit der emojiUnicode-Funktion Zeichen aus dem 32 Bit Bereich genau so wie ich es mir wünsche:

Code
function emojiUnicode (emoji) { 
var comp;
if (emoji.length === 1) {
comp = emoji.charCodeAt(0);
}
comp = (
(emoji.charCodeAt(0) - 0xD800) * 0x400
+ (emoji.charCodeAt(1) - 0xDC00) + 0x10000
);
if (comp < 0) {
comp = emoji.charCodeAt(0);
}
return comp.toString("16");
};


Ein Freund wies mich auf einen Beitrag hin, den ich noch nicht konzentriert lesen konnte:

What every JavaScript developer should know about Unicode

Leider funktionieren bei mir weder der dort erwähnte codePointAt()- noch fromCodePoint()-Befehl.

Viele Grüße
Martin



(Dieser Beitrag wurde von Martin Fischer am 21. Apr 2021, 14:38 geändert)

decodeunicode U+1D538

WernerPerplies
Beiträge gesamt: 2762

21. Apr 2021, 14:39
Bewertung:

gelesen: 8061

Beitrag als Lesezeichen
Wie wäre es denn, wenn Sie Beispieldaten und eine genaue Beschreibung, wie Sie vorgehen, liefern würden?

Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen

decodeunicode U+1D538

Martin Fischer
  
Beiträge gesamt: 12783

21. Apr 2021, 15:40
Bewertung:

gelesen: 8003

Beitrag als Lesezeichen
Nach dem Umbau der emojiUnicode-Funktion mit Hilfe von »Else« funktioniert es mit 16 Bit- und mit 32 Bit-Zeichen:

Code
$.writeln(char2unicode('A')); 

function char2unicode(str)
{
var comp,
uni;
if (str.length === 1)
{
comp = str.charCodeAt(0);
}
else
{
comp = (
(str.charCodeAt(0) - 0xD800) * 0x400 +
(str.charCodeAt(1) - 0xDC00) + 0x10000
);
if (comp < 0)
{
comp = emoji.charCodeAt(0);
}
}
uni = comp.toString("16").toUpperCase();
while (uni.length < 4)
{
uni = '0' + uni;
}
return uni;
};


Das 32-Bit Zeichen können Sie aus https://decodeunicode.org/en/u+1D538 entnehmen und statt dem 'A' in »$.writeln(char2unicode('A'));« einsetzen.

Das lasse ich jetzt mal auf 800 Glyphen eines Fonts los. ;-)

Viele Grüße
Martin


decodeunicode U+1D538

Martin Fischer
  
Beiträge gesamt: 12783

21. Apr 2021, 15:52
Bewertung:

gelesen: 7988

Beitrag als Lesezeichen
Super!
Das Ergebnis kann sich sehen lassen.



Viele Grüße
Martin



Anhang:
Bildschirmfoto.png (194 KB)

decodeunicode U+1D538

WernerPerplies
Beiträge gesamt: 2762

21. Apr 2021, 17:07
Bewertung:

gelesen: 7927

Beitrag als Lesezeichen
Schön, dass es jetzt klappt. Also wie ich vermutet habe, zwei Zeichen (vier Byte) als Input
Code
      comp = (  
(str.charCodeAt(0) - 0xD800) * 0x400 +
(str.charCodeAt(1) - 0xDC00) + 0x10000
);


Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen