[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt decodeunicode U+1D538

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

decodeunicode U+1D538

Martin Fischer
  
Beiträge gesamt: 12778

21. Apr 2021, 08:36
Beitrag # 1 von 14
Bewertung:
(8261 mal gelesen)
URL zum Beitrag
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?
X

decodeunicode U+1D538

WernerPerplies
Beiträge gesamt: 2759

21. Apr 2021, 09:11
Beitrag # 2 von 14
Beitrag ID: #579610
Bewertung:
(8245 mal gelesen)
URL zum Beitrag
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



als Antwort auf: [#579609]
(Dieser Beitrag wurde von WernerPerplies am 21. Apr 2021, 09:30 geändert)

decodeunicode U+1D538

Martin Fischer
  
Beiträge gesamt: 12778

21. Apr 2021, 09:46
Beitrag # 3 von 14
Beitrag ID: #579611
Bewertung:
(8231 mal gelesen)
URL zum Beitrag
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


als Antwort auf: [#579610]
(Dieser Beitrag wurde von Martin Fischer am 21. Apr 2021, 09:47 geändert)

decodeunicode U+1D538

WernerPerplies
Beiträge gesamt: 2759

21. Apr 2021, 09:57
Beitrag # 4 von 14
Beitrag ID: #579613
Bewertung:
(8218 mal gelesen)
URL zum Beitrag
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/


als Antwort auf: [#579611]
(Dieser Beitrag wurde von WernerPerplies am 21. Apr 2021, 10:07 geändert)

decodeunicode U+1D538

WernerPerplies
Beiträge gesamt: 2759

21. Apr 2021, 10:42
Beitrag # 5 von 14
Beitrag ID: #579614
Bewertung:
(8165 mal gelesen)
URL zum Beitrag
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"


als Antwort auf: [#579611]

decodeunicode U+1D538

WernerPerplies
Beiträge gesamt: 2759

21. Apr 2021, 11:08
Beitrag # 6 von 14
Beitrag ID: #579615
Bewertung:
(8141 mal gelesen)
URL zum Beitrag
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;
}



als Antwort auf: [#579611]

decodeunicode U+1D538

Martin Fischer
  
Beiträge gesamt: 12778

21. Apr 2021, 11:46
Beitrag # 7 von 14
Beitrag ID: #579616
Bewertung:
(8126 mal gelesen)
URL zum Beitrag
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.


als Antwort auf: [#579613]

decodeunicode U+1D538

Martin Fischer
  
Beiträge gesamt: 12778

21. Apr 2021, 11:52
Beitrag # 8 von 14
Beitrag ID: #579617
Bewertung:
(8114 mal gelesen)
URL zum Beitrag
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.


als Antwort auf: [#579615]
(Dieser Beitrag wurde von Martin Fischer am 21. Apr 2021, 11:54 geändert)

decodeunicode U+1D538

WernerPerplies
Beiträge gesamt: 2759

21. Apr 2021, 13:36
Beitrag # 9 von 14
Beitrag ID: #579618
Bewertung:
(8054 mal gelesen)
URL zum Beitrag
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.


als Antwort auf: [#579617]

decodeunicode U+1D538

Martin Fischer
  
Beiträge gesamt: 12778

21. Apr 2021, 14:36
Beitrag # 10 von 14
Beitrag ID: #579620
Bewertung:
(8034 mal gelesen)
URL zum Beitrag
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.


als Antwort auf: [#579618]
(Dieser Beitrag wurde von Martin Fischer am 21. Apr 2021, 14:38 geändert)

decodeunicode U+1D538

WernerPerplies
Beiträge gesamt: 2759

21. Apr 2021, 14:39
Beitrag # 11 von 14
Beitrag ID: #579621
Bewertung:
(8025 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Wie wäre es denn, wenn Sie Beispieldaten und eine genaue Beschreibung, wie Sie vorgehen, liefern würden?


als Antwort auf: [#579620]

decodeunicode U+1D538

Martin Fischer
  
Beiträge gesamt: 12778

21. Apr 2021, 15:40
Beitrag # 12 von 14
Beitrag ID: #579622
Bewertung:
(7967 mal gelesen)
URL zum Beitrag
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. ;-)


als Antwort auf: [#579621]

decodeunicode U+1D538

Martin Fischer
  
Beiträge gesamt: 12778

21. Apr 2021, 15:52
Beitrag # 13 von 14
Beitrag ID: #579624
Bewertung:
(7952 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Super!
Das Ergebnis kann sich sehen lassen.




als Antwort auf: [#579622]
Anhang:
Bildschirmfoto.png (194 KB)

decodeunicode U+1D538

WernerPerplies
Beiträge gesamt: 2759

21. Apr 2021, 17:07
Beitrag # 14 von 14
Beitrag ID: #579625
Bewertung:
(7891 mal gelesen)
URL zum Beitrag
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
);



als Antwort auf: [#579622]
X