Zeichenkodierung – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self Zeichenkodierung Mon, 15 Oct 18 06:03:28 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734206#m1734206 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734206#m1734206 <p>moin,</p> <p>warum sehe ich hier kein Eurozeichen sondern 3 Andere?</p> <pre><code class="block language-js">console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>String<span class="token punctuation">.</span><span class="token function">fromCharCode</span><span class="token punctuation">(</span><span class="token number">0xe2</span><span class="token punctuation">,</span><span class="token number">0x82</span><span class="token punctuation">,</span><span class="token number">0xac</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Es sind doch die richtigen Zahlen. MfG</p> Zeichenckodierung Mon, 15 Oct 18 06:06:17 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734207#m1734207 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734207#m1734207 <p>Hallo pl,</p> <blockquote> <pre><code class="block language-js">console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>String<span class="token punctuation">.</span><span class="token function">fromCharCode</span><span class="token punctuation">(</span><span class="token number">0xe2</span><span class="token punctuation">,</span><span class="token number">0x82</span><span class="token punctuation">,</span><span class="token number">0xac</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Es sind doch die richtigen Zahlen.</p> </blockquote> <p>Nein. Der Codepoint für das Euro-Zeichen ist U+20AC. Richtig wäre also <code>String.fromCharCode(0x20AC)</code>.</p> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> Zeichenkodierung Mon, 15 Oct 18 06:11:54 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734208#m1734208 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734208#m1734208 <p>@@pl</p> <blockquote> <p>warum sehe ich hier kein Eurozeichen sondern 3 Andere?</p> <pre><code class="block language-js">console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>String<span class="token punctuation">.</span><span class="token function">fromCharCode</span><span class="token punctuation">(</span><span class="token number">0xe2</span><span class="token punctuation">,</span><span class="token number">0x82</span><span class="token punctuation">,</span><span class="token number">0xac</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> </blockquote> <p>Weil du immer noch nicht auf der Ebene angekommen bist, Zeichen als Zeichen zu behandeln und nicht als Bytes.</p> <p>LLAP </p> <div class="signature">-- <br> <em>„Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“</em> —Kurt Weidemann </div> Zeichenkodierung Mon, 15 Oct 18 06:42:39 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734211#m1734211 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734211#m1734211 <p>Hi,</p> <blockquote> <p>warum sehe ich hier kein Eurozeichen sondern 3 Andere?</p> <pre><code class="block language-js">console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>String<span class="token punctuation">.</span><span class="token function">fromCharCode</span><span class="token punctuation">(</span><span class="token number">0xe2</span><span class="token punctuation">,</span><span class="token number">0x82</span><span class="token punctuation">,</span><span class="token number">0xac</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> </blockquote> <p>weil die Methode fromCharCode heißt, nicht fromUtf8Bytes.</p> <p>cu,<br> Andreas a/k/a MudGuard</p> Zeichenkodierung Mon, 15 Oct 18 13:01:35 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734284#m1734284 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734284#m1734284 <p>Hallo pl,</p> <p>ich hab Dir schon öfter mal das Uint8Array als geeigneten Datentyp empfohlen. Es gibt im File API keinen FileWriter mit einer Methode writeFromBinaryString.</p> <pre><code class="block language-js">utf8euro <span class="token operator">=</span> Uint8Array<span class="token punctuation">.</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">0xe2</span><span class="token punctuation">,</span> <span class="token number">0x82</span><span class="token punctuation">,</span> <span class="token number">0xac</span> <span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> euro <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TextDecoder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">decode</span><span class="token punctuation">(</span>utf8euro<span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Du kannst für einen Roundtrip String -> „Binary String“ -> String aber auch einen kleinen Helper bauen (den Kompatibilitätscheck überlasse ich Dir) und das Ganze damit relativ kompakt darstellen:</p> <pre><code class="block language-js"><span class="token comment">// Helper zum Iterieren über die CharCodes eines String</span> <span class="token keyword">function</span><span class="token operator">*</span> <span class="token function">iterateCharCodes</span><span class="token punctuation">(</span><span class="token parameter">s</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> c <span class="token keyword">of</span> s<span class="token punctuation">)</span> <span class="token keyword">yield</span> c<span class="token punctuation">.</span><span class="token function">charCodeAt</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">let</span> hello <span class="token operator">=</span> <span class="token string">"Hällo Wörld für 217€"</span><span class="token punctuation">;</span> <span class="token keyword">let</span> hBlob <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Blob</span><span class="token punctuation">(</span><span class="token punctuation">[</span>hello<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> fr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FileReader</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> fr<span class="token punctuation">.</span><span class="token function-variable function">onload</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"„Binary String“: "</span> <span class="token operator">+</span> fr<span class="token punctuation">.</span>result<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> ui <span class="token operator">=</span> Uint8Array<span class="token punctuation">.</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token function">iterateCharCodes</span><span class="token punctuation">(</span>fr<span class="token punctuation">.</span>result<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"Reconstructed String: "</span> <span class="token operator">+</span> <span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">TextDecoder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">decode</span><span class="token punctuation">(</span>ui<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> fr<span class="token punctuation">.</span><span class="token function">readAsBinaryString</span><span class="token punctuation">(</span>hBlob<span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Der TextDecoder will dummerweise etwas Bufferoides haben und nimmt den Iterator nicht direkt an.</p> <p>Mit iterateCharCodes kannst Du einen beliebigen String („binary string“ oder jeder sonst) in seine Zeichen zerlegen und einen Iterator über die Unicode Codepoints bekommen. Den Iterator kannst Du mit for...of konsumieren oder an Factorymethoden wie Uint8Array.from übergeben.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Zeichenkodierung Mon, 15 Oct 18 17:50:33 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734294#m1734294 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734294#m1734294 <p>Hello lieber Gunnar,</p> <blockquote> <blockquote> <p>warum sehe ich hier kein Eurozeichen sondern 3 Andere?</p> <pre><code class="block language-js">console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>String<span class="token punctuation">.</span><span class="token function">fromCharCode</span><span class="token punctuation">(</span><span class="token number">0xe2</span><span class="token punctuation">,</span><span class="token number">0x82</span><span class="token punctuation">,</span><span class="token number">0xac</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> </blockquote> <p>Weil du immer noch nicht auf der Ebene angekommen bist, Zeichen als Zeichen zu behandeln und nicht als Bytes.</p> </blockquote> <p>Definiere bitte "Zeichen" und "Symbol", bzw. "Glyphe". Sonst komme ich nämlich auch nicht mit.</p> <p>Soweit ich das bisher verstanden habe, wird das Eurosymbol hier mittels zweier Zeichen codiert, oder ist das falsch?</p> <p>Glück Auf<br> Tom vom Berg</p> <div class="signature">-- <br> Es gibt nichts Gutes, außer man tut es!<br> Das Leben selbst ist der Sinn.<br> </div> Zeichenkodierung Mon, 15 Oct 18 14:37:31 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734292#m1734292 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734292#m1734292 <p>hi <a href="/users/6547" class="mention registered-user" rel="noopener noreferrer">@Rolf B</a></p> <p>ich interpretiere das auch so wie Du, daß JS den Sting als Binary String auffasst, also als Folge von Bytes und nicht als Folge von Zeichen.</p> <p>In Perl sähe das so aus:</p> <pre><code class="block language-perl"><span class="token variable">$bytes</span> <span class="token operator">=</span> pack <span class="token string">"CCC"</span><span class="token punctuation">,</span> <span class="token number">0xe2</span><span class="token punctuation">,</span> <span class="token number">0x82</span><span class="token punctuation">,</span> <span class="token number">0xac</span><span class="token punctuation">;</span> <span class="token comment"># oder byte für byte</span> chr<span class="token punctuation">(</span><span class="token number">0xe2</span><span class="token punctuation">)</span><span class="token operator">.</span>chr<span class="token punctuation">(</span><span class="token number">0x82</span><span class="token punctuation">)</span><span class="token operator">.</span>chr<span class="token punctuation">(</span><span class="token number">0xac</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Mitteles StringView() macht JS aus der Bytefolge eine Zeichenfolge. In dieser Lib ist also die Umrechnung von Bytes in Codepoint und umgekehrt implementiert. Siehe ebenda.</p> <p>MfG</p> Zeichenkodierung Mon, 15 Oct 18 18:15:38 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734298#m1734298 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734298#m1734298 <p>@@TS</p> <blockquote> <p>Definiere bitte "Zeichen" und "Symbol", bzw. "Glyphe". Sonst komme ich nämlich auch nicht mit.</p> <p>Soweit ich das bisher verstanden habe, wird das Eurosymbol hier mittels zweier Zeichen codiert, oder ist das falsch?</p> </blockquote> <p>Ja, ist es.</p> <p>Das Eurosymbol ist <strong>ein</strong> Symbol ist <strong>ein</strong> Zeichen. Dieses hat – wie CK schon sagte – den Zeichencode (<em lang="en">codepoint</em>) U+20AC.</p> <p>Dass dieser Codepoint in UTF-8 durch 3 Bytes codiert wird, interessiert an dieser Stelle außer Hotti vermutlich niemanden.</p> <p>Glyphen sind graphische Repräsentationen von Schriftzeichen. In einer Schriftart könnte die Glyphe fürs <a href="https://de.wikipedia.org/wiki/Eurozeichen" rel="nofollow noopener noreferrer">Eurosymbol</a> so aussehen wie urspünglich gestaltet:</p> <p><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/5/57/Euro_Construction.svg/500px-Euro_Construction.svg.png" alt="Konstruktionszeichnung des Eurosymbols" loading="lazy"></p> <p>In einer anderen Schriftart könnte die Glyphe fürs Eurosymbols so aussehen wie ein großes C dieser Schriftart mit zwei Querstrichen.</p> <p>LLAP </p> <div class="signature">-- <br> <em>„Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“</em> —Kurt Weidemann </div> Zeichenkodierung Mon, 15 Oct 18 19:02:42 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734299#m1734299 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734299#m1734299 <p>Tach!</p> <blockquote> <blockquote> <p>Weil du immer noch nicht auf der Ebene angekommen bist, Zeichen als Zeichen zu behandeln und nicht als Bytes.</p> </blockquote> <p>Definiere bitte "Zeichen" und "Symbol", bzw. "Glyphe". Sonst komme ich nämlich auch nicht mit.</p> </blockquote> <p>Javascript läuft (serverseitiges Javascript auslassend) im Browser als Aufsatz zu HTML. Es kommt theoretisch nicht mit physikalischen Gegebenheiten in Berührung. Das Dekodieren von Code und Texten hat bereits der Browser getan, bevor Javascript an die Reihe kommt. Somit liegen auf der Ebene, auf der Javascript arbeitet, keine "Zeichen, UTF-8-kodiert" mehr vor, sondern nur noch "Zeichen" so wie sie in Unicode definiert sind, unabhängig von UTFs.</p> <p>Auch Zahlen existieren in Javascript nur als das theoretische Gebilde und nicht in irgendwelchen physikalischen Speicherformen wie 8/16/32/64-Bit Integer oder Floats. Für Zahlen gibt es einfach nur den Typ Number.</p> <p>dedlfix.</p> Zeichenkodierung Tue, 16 Oct 18 06:17:30 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734306#m1734306 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734306#m1734306 <p>he Tom,</p> <blockquote> <p>Soweit ich das bisher verstanden habe, wird das Eurosymbol hier mittels zweier Zeichen codiert, oder ist das falsch?</p> </blockquote> <p>Wie kommst Du denn darauf? Zeichen werden immer mit Bytes kodiert und für das Eurozeichen sind es 3 Bytes mit den hier gezeigten Wertigkeiten.</p> <p>MfG</p> Zeichenkodierung Tue, 16 Oct 18 06:53:14 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734307#m1734307 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734307#m1734307 <p>Hallo pl,</p> <p>Nein, Nein, Nein.</p> <p>Zeichen werden durch <strong>Zahlen</strong> codiert. In Falle klassischer Zeichensätze im Bereich von 0 bis 255, was die Illusion erzeugte, Zeichen und Bytes seien das gleiche. Bei Unicode sind es Zahlen im Bereich von 0 bis 0x10ffff.</p> <p>Wenn es nötig ist, diese Zahlen irgendwo auf ein Speicher- oder Transportmedium zu bringen, werden sie mittels eines Encodings in eine Bytesequenz übersetzt. Z.B. UTF-8 oder UTF-16.</p> <p>Laufzeitumgebungen wie JavaScript oder .net nutzen UTF-16 auch für die Darstellung im Speicher. Das API versteckt das vor dir.</p> <p>Libraries wie StringView.js führen diese Übersetzung transparent aus und lassen dich einen UTF-8 codierten ArrayBuffer wie einen Unicode-String behandeln.</p> <p>Sprachen wie PHP haben Strings, in denen ein Zeichen nur ein Byte hat. Ein solcher String kann aber auch eine UTF-8 codierte Bytefolge speichern, und mit den mb_... Funktionen analog zu StringView.js als Unicode-String verarbeitet werden.</p> <p>Ach so. Eine Glyphe ist klassisch die visuelle Darstellung eines Zeichens gemäß dem gewählten Font. Im Fall von Unicode gibt es auch Glyphen, die auf Grund einer Sequenz von Unicode-Zeichen gezeichnet werden. Beispiel: a und ` gibt à, a und ~ gibt ã. In diesem Fall hat Unicode auch eigene Zeichen für ã und à, es gibt, z.B. im Bereich der Smileys, aber auch etliche Glyphen die keine normalisierte Darstellung haben.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Zeichenkodierung Tue, 16 Oct 18 08:35:34 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734312#m1734312 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734312#m1734312 <p>@@Rolf B</p> <blockquote> <p>Das API versteckt das vor dir.</p> </blockquote> <p>Schon für den sächlichen Artrikel hast du dir einen Pluspunkt verdient.</p> <blockquote> <p>Im Fall von Unicode gibt es auch Glyphen, die auf Grund einer Sequenz von Unicode-Zeichen gezeichnet werden.</p> </blockquote> <p>Gezeichnet?? Was meinst du damit?</p> <blockquote> <p>Beispiel: a und ` gibt à, a und ~ gibt ã.</p> </blockquote> <p>Nicht so ganz:</p> <ul> <li>a und ` U+0060 GRAVE ACCENT gibt nicht à. a und ̀ U+0300 COMBINING GRAVE ACCENT gibt à.</li> <li>a und ~ U+007E TILDE gibt nicht ã. a und ̃ U+0303 COMBINING TILDE gibt à.</li> </ul> <p>☞ <a href="https://www.w3.org/International/questions/qa-html-css-normalization" rel="nofollow noopener noreferrer">Normalisierung</a></p> <blockquote> <p>In diesem Fall hat Unicode auch eigene Zeichen für ã und à,</p> </blockquote> <p>#lazyweb Wie müssen eigentlich Kombinationen verarbeitet werden, die kein Unicode-Zeichen ergeben, bspw. b und ̀ U+0300 COMBINING GRAVE ACCENT?</p> <p>LLAP </p> <div class="signature">-- <br> <em>„Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“</em> —Kurt Weidemann </div> Zeichenkodierung Tue, 16 Oct 18 15:09:12 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734337#m1734337 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734337#m1734337 <p>hi <a href="/users/6547" class="mention registered-user" rel="noopener noreferrer">@Rolf B</a></p> <blockquote> <p>Nein, Nein, Nein.</p> <p>Zeichen werden durch <strong>Zahlen</strong> codiert.</p> </blockquote> <p>So isses. Und aus den Zahlen werden bytes mit Wertigkeiten von jeweils 0..255. <code>localStorage.set('string',string)</code> speichert Strings und Strings sind Bytefolgen. <code>xhr.send(string)</code> sendet auch keine Zahlen sondern Bytefolgen.</p> <p>Aber eigentlich wollte ich nur wissen wie <a href="/users/4179" class="mention registered-user" rel="noopener noreferrer">@TS</a> darauf kommt daß daß Eurozeichen vermittels zweier Zeichen kodiert wird.</p> <p>Und für Dich <a href="/users/6547" class="mention registered-user" rel="noopener noreferrer">@Rolf B</a> : Kodierung heißt, daß Daten das System als String (Bytefolge) verlassen. Also STDOUT & Co. Wie kommst Du eigentlich darauf daß da Zahlen rausgehen? Schreibst Du etwa Zahlen in Textdateien und erwartest daß der Editor Zeichen daraus macht?</p> <p>Und ja: <a href="http://rolfrost.de/php_codepoint.html" rel="nofollow noopener noreferrer">StringView</a> für PHP (nur utf-8 und nur bis 3 bytes).</p> <p>MfG</p> Zeichenkodierung Tue, 16 Oct 18 08:54:48 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734313#m1734313 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734313#m1734313 <p>Hallo Gunnar,</p> <p>ja gut, ich wollte jetzt nicht zu sehr in die Details einsteigen.</p> <p>Eine mit \u0300 gravis-verpestete Buchstabenreihe sieht bei mir so aus - keine Ahnung ob eurer Browser das darstellen.</p> <p>#àb̀c̀d̀èf̀g̀h̀ìj̀k̀l̀m̀ǹòp̀q̀r̀s̀t̀ùv̀ẁx̀ỳz̀ÀB̀C̀D̀ÈF̀G̀H̀ÌJ̀K̀L̀M̀ǸÒP̀Q̀R̀S̀T̀ÙV̀ẀX̀ỲZ̀0̀1̀2̀3̀4̀5̀6̀7̀8̀9̀</p> <p>Erzeugt in der Browser-Konsole mit</p> <pre><code class="block language-js">s <span class="token operator">=</span> <span class="token string">""</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> x <span class="token keyword">of</span> <span class="token string">"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"</span><span class="token punctuation">)</span> s <span class="token operator">=</span> s <span class="token operator">+</span> x <span class="token operator">+</span> String<span class="token punctuation">.</span><span class="token function">fromCodePoint</span><span class="token punctuation">(</span><span class="token number">0x300</span><span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Man kann auch noch eine Schippe Tilden und Querbalken drauflegen, aber mit den Zahlen hat er's dann nicht so...</p> <p>#à̃̅b̀̃̅c̀̃̅d̀̃̅è̃̅f̀̃̅g̀̃̅h̀̃̅ì̃̅j̀̃̅k̀̃̅l̀̃̅m̀̃̅ǹ̃̅ò̃̅p̀̃̅q̀̃̅r̀̃̅s̀̃̅t̀̃̅ù̃̅v̀̃̅ẁ̃̅x̀̃̅ỳ̃̅z̀̃̅ À̃̅B̀̃̅C̀̃̅D̀̃̅È̃̅F̀̃̅G̀̃̅H̀̃̅Ì̃̅J̀̃̅K̀̃̅L̀̃̅M̀̃̅Ǹ̃̅Ò̃̅P̀̃̅Q̀̃̅R̀̃̅S̀̃̅T̀̃̅Ù̃̅V̀̃̅Ẁ̃̅X̀̃̅Ỳ̃̅Z̀̃̅ 0̀̃̅1̀̃̅2̀̃̅3̀̃̅4̀̃̅5̀̃̅6̀̃̅7̀̃̅8̀̃̅9̀̃̅</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Zeichenkodierung Tue, 16 Oct 18 08:58:29 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734314#m1734314 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734314#m1734314 <blockquote> <p>#lazyweb Wie müssen eigentlich Kombinationen verarbeitet werden, die kein Unicode-Zeichen ergeben, bspw. b und ̀ U+0300 COMBINING GRAVE ACCENT?</p> </blockquote> <p>So wie immer, denn das ist der Default; bei Sequenzen die kanonische äquivalente Zeichen haben, sollen die unterschiedlichen Schreibweisen nicht als unterschiedliche Bedeutung des Zeichens interpretiert werden; z.B. sollen 00C1 und 0041 0301 gleich sortiert werden, weil beide das kanonisch gleiche Zeichen „a akut“ bedeuten.</p> Zeichenkodierung Tue, 16 Oct 18 09:07:48 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734316#m1734316 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734316#m1734316 <p>Hallo usb,</p> <p>guter Hinweis.</p> <p>Rrrrrespekt nach Redmont - ich habe Excel die Worte ab̀er, abba und ablauf sortieren lassen, und tatsächlich: abba, ab̀er, ablauf!</p> <p>Chrome stellt in <code>["ab̀er", "abba", "ablauf"].sort()</code> das ab̀er ans Ende, d.h. er betrachtet das kombinierende Zeichen separat. Tz...</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Zeichenkodierung Tue, 16 Oct 18 10:16:52 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734322#m1734322 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734322#m1734322 <blockquote> <p>Rrrrrespekt nach Redmont - ich habe Excel die Worte ab̀er, abba und ablauf sortieren lassen, und tatsächlich: abba, ab̀er, ablauf!</p> <p>Chrome stellt in <code>["ab̀er", "abba", "ablauf"].sort()</code> das ab̀er ans Ende, d.h. er betrachtet das kombinierende Zeichen separat. Tz...</p> </blockquote> <p>Hast du in beiden die selben Spracheinstellungen? Im österreichischen wird z.B. das ä nach dem a einsortiert, da wäre es dann nicht unlogisch auch das b̀ nach dem b einzusortieren.</p> Zeichenkodierung Tue, 16 Oct 18 10:34:35 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734326#m1734326 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734326#m1734326 <p>Hallo usb,</p> <p>nee, ich hab's nur falsch gemacht. [].sort sortiert blind nach Codepunktwert, wenn man es nach Unicode-Zeichenregeln haben will braucht man einen Comparer der ein locale nutzt.</p> <pre><code class="block bad language-js"><span class="token punctuation">[</span> <span class="token string">"ab̀ba"</span><span class="token punctuation">,</span> <span class="token string">"abbau"</span><span class="token punctuation">,</span> <span class="token string">"ablaufen"</span><span class="token punctuation">,</span> <span class="token string">"abba"</span><span class="token punctuation">,</span> <span class="token string">"abalone"</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">sort</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">a<span class="token punctuation">,</span>b</span><span class="token punctuation">)</span> <span class="token operator">=></span> a<span class="token punctuation">.</span><span class="token function">localeCompare</span><span class="token punctuation">(</span>b<span class="token punctuation">,</span> <span class="token string">"de-DE"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> </code></pre> <p>liefert <code>["abalone", "abba", "ab̀ba", "abbau", "ablaufen"]</code>, auch für de-AT, de-CH, en-US oder fr-FR.</p> <p>Wobei dieses Sortieren natürlich nicht als Vorbild geeignet ist, da fehlen Typ- und Nullprüfungen. Deswegen hab ich's gleich rot angepinselt.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Zeichenkodierung Tue, 16 Oct 18 15:59:47 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734340#m1734340 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734340#m1734340 <p>Hallo pl,</p> <blockquote> <blockquote> <p>Zeichen werden durch Zahlen codiert.</p> </blockquote> </blockquote> <blockquote> <p>So isses. Und aus den Zahlen werden bytes mit Wertigkeiten von jeweils 0..255.</p> </blockquote> <p>Wenn Du doch mal die Schritte einzeln machen würdest.</p> <p>Ich hätte „Zeichen werden durch Zahlen codiert“ besser als „Zeichen werden während der Verarbeitung durch Zahlen codiert“ geschrieben. Codierung geschieht auf mehreren Ebenen. In-Memory: Zeichen als Zahlen, Storage: Zahlen als Bytefolgen</p> <p>Und manchmal erfolgt die Codierung Bytefolge <-> Zahl auch transparent, z.B. bei StringView oder den PHP mb_-Funktionen. Aber umcodieren zwischen Bytefolge und Zahl müssen sie. Sonst kommt Müll raus.</p> <blockquote> <p>Und für Dich <a href="/users/6547" class="mention registered-user" rel="noopener noreferrer">@Rolf B</a> : Kodierung heißt, daß Daten das System als String (Bytefolge) verlassen. Also STDOUT & Co. Wie kommst Du eigentlich darauf daß da Zahlen rausgehen?</p> </blockquote> <p>Hab ich nie behauptet. Lies nochmal genau. Und mach die Schritte EINZELN. Es gibt eine Schicht zwischen Zeichen und Bytes. WIRKLICH!</p> <blockquote> <p>Aber eigentlich wollte ich nur wissen wie <a href="/users/4179" class="mention registered-user" rel="noopener noreferrer">@TS</a> darauf kommt daß Eurozeichen vermittels zweier Zeichen kodiert wird.</p> </blockquote> <p>Ja, der hat auch Bytes und Codepoint (=Zahl) verwechselt. Vielleicht gibt's ja auch einen Codepoint "combining equals sign", den man einem L, Y oder C überlagern kann, für eine Not-Darstellung von Pfund, Yen und Euro . Gefunden habe ich nur ein Gleichheitszeichen oben oder unten, ergibt damm Y͇ (combining equals sign below) oder Y̿ (combining double overline). DAS wären dann zwei ZEICHEN und ein GLYPH. Glaube ich jedenfalls...</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Zeichenkodierung Tue, 16 Oct 18 16:51:43 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734345#m1734345 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734345#m1734345 <p>hi <a href="/users/6547" class="mention registered-user" rel="noopener noreferrer">@Rolf B</a></p> <blockquote> <p>Hab ich nie behauptet. Lies nochmal genau. Und mach die Schritte EINZELN. Es gibt eine Schicht zwischen Zeichen und Bytes. WIRKLICH!</p> </blockquote> <p>Genau: Die Kodierung. So liegt der Codepoint des € 0x20Ac zwischen zwischen 0x800 und 0x10000 und das heißt, daß dieses Zeichen mit 3 Bytes zu kodieren ist wenn die Kodierung utf-8 heißt.</p> <p>Dieser Algorithmus in PHP ($cp ist der Codepoint):</p> <pre><code class="block language-php"><span class="token variable">$bytes</span> <span class="token operator">=</span> <span class="token function">pack</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'CCC'</span><span class="token punctuation">,</span> <span class="token number">0xe0</span> <span class="token operator">+</span> <span class="token punctuation">(</span><span class="token variable">$cp</span> <span class="token operator">>></span> <span class="token number">12</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">0x80</span> <span class="token operator">+</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token variable">$cp</span> <span class="token operator">>></span> <span class="token number">6</span><span class="token punctuation">)</span> <span class="token operator">&</span> <span class="token number">0x3f</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">0x80</span> <span class="token operator">+</span> <span class="token punctuation">(</span><span class="token variable">$cp</span> <span class="token operator">&</span> <span class="token number">0x3f</span> <span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Was diese 3 Bytes (0xE2, 0x82, 0xAC) erzeugt.</p> <blockquote> <blockquote> <p>Aber eigentlich wollte ich nur wissen wie <a href="/users/4179" class="mention registered-user" rel="noopener noreferrer">@TS</a> darauf kommt daß Eurozeichen vermittels zweier Zeichen kodiert wird.</p> </blockquote> <p>Ja, der hat auch Bytes und Codepoint (=Zahl) verwechselt.</p> </blockquote> <p>Nun, das <a href="http://rolfrost.de/ucd.html?checkout=20AC&gui=1" rel="nofollow noopener noreferrer">Eurozeichen</a> hat nur einen Codepoint, kein Decomposition Mapping und UTF-8-kodiert genau 3 Bytes.</p> <p>Wie <a href="/users/4179" class="mention registered-user" rel="noopener noreferrer">@TS</a> unter diesen Umständen auf 2 Zeichen kommt wird wohl immer sein Geheimnis bleiben.</p> <p>MfG</p> Zeichenkodierung Tue, 16 Oct 18 17:27:41 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734347#m1734347 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734347#m1734347 <p>Hallo,</p> <p>nur dass ich das richtig verstanden habe, weil ich es interessant finde und mich leider noch nie so richtig mit dieser Thematik beschäftigt habe. Methoden wie fromCharCode() verlangen die Nummer eines Unicode-Zeichens. Mir kann egal sein, wie die JavaScript-Engine dieses Zeichen im Speicher hält, es ist nur wichtig, dass ich die Unicode-Nummer weiß. Wenn ich aber dieses Zeichen auf der Festplatte speichern möchte, brauche ich ein Encoding wie UTF-8, dass dieses Zeichen dann irgendwie in Bytefolgen gießt. Habe ich das so richtig wiedergegeben?</p> <blockquote> <p>Wie <a href="/users/4179" class="mention registered-user" rel="noopener noreferrer">@TS</a> unter diesen Umständen auf 2 Zeichen kommt wird wohl immer sein Geheimnis bleiben.</p> </blockquote> <p>Vermutlich aus dem selben Grund wie ich: Nicht besser gewusst, d.h. ich hätte auch angenommen, dass das Euro-Zeichen mit 2 Bytes codiert wird.</p> <p>Gruß<br> Patrick</p> Zeichenkodierung Tue, 16 Oct 18 17:52:02 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734348#m1734348 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734348#m1734348 <p>Tach!</p> <blockquote> <p>nur dass ich das richtig verstanden habe, weil ich es interessant finde und mich leider noch nie so richtig mit dieser Thematik beschäftigt habe. Methoden wie fromCharCode() verlangen die Nummer eines Unicode-Zeichens. Mir kann egal sein, wie die JavaScript-Engine dieses Zeichen im Speicher hält, es ist nur wichtig, dass ich die Unicode-Nummer weiß. Wenn ich aber dieses Zeichen auf der Festplatte speichern möchte, brauche ich ein Encoding wie UTF-8, dass dieses Zeichen dann irgendwie in Bytefolgen gießt. Habe ich das so richtig wiedergegeben?</p> </blockquote> <p>Ja, nur dass klassisches JavaScript nichts auf der Festplatte speichern kann. Es gibt zwar mittlerweile den LocalStorage im Browser, aber JS kann nur entsprechende API-Funktionen aufrufen und seinen String übergeben und entgegennehmen. Das Kodieren und Speichern findet in Ebenen unterhalb von Javascript statt.</p> <p>String.fromCharCode() kann aber nur die BMP, also Zeichen unterhalb von CodePoint 65536. Für den vollen Zeichenvorrat, inklusive solch wertvoller Zeichen wie Nummer 128169 (1F4A9), muss man nicht die Funktionen mit CharCode im Namen nehmen, sondern die mit CodePoint, also String.fromCodePoint() und String.prototype.codePointAt().</p> <blockquote> <blockquote> <p>Wie <a href="/users/4179" class="mention registered-user" rel="noopener noreferrer">@TS</a> unter diesen Umständen auf 2 Zeichen kommt wird wohl immer sein Geheimnis bleiben.</p> </blockquote> <p>Vermutlich aus dem selben Grund wie ich: Nicht besser gewusst, d.h. ich hätte auch angenommen, dass das Euro-Zeichen mit 2 Bytes codiert wird.</p> </blockquote> <p>Für Javascript hat es nur eine Nummer, den Unicode-CodePoint.</p> <p>Man kann davon ausgehen, dass unter der Haube, also in den Tiefen der Javascript-Engine, UTF-16 oder eine vergleichbare Zwei-Byte-Kodierung zum Einsatz kommt. Damit lässt sich in wesentlichen Teilen (sprich unterhalb CodePoint 65536) einfacher hantieren als mit UTF-8 mit seiner deutlich variableren Länge, die man ständig beachten müsste. Das wären dann aber zwei Byte, nicht zwei Zeichen.</p> <p>dedlfix.</p> Zeichenkodierung Tue, 16 Oct 18 20:20:39 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734353#m1734353 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734353#m1734353 <p>Hallo,</p> <blockquote> <p>nur dass ich das richtig verstanden habe, weil ich es interessant finde und mich leider noch nie so richtig mit dieser Thematik beschäftigt habe. Methoden wie fromCharCode() verlangen die Nummer eines Unicode-Zeichens. Mir kann egal sein, wie die JavaScript-Engine dieses Zeichen im Speicher hält, es ist nur wichtig, dass ich die Unicode-Nummer weiß. Wenn ich aber dieses Zeichen auf der Festplatte speichern möchte, brauche ich ein Encoding wie UTF-8, dass dieses Zeichen dann irgendwie in Bytefolgen gießt. Habe ich das so richtig wiedergegeben?</p> </blockquote> <p>Ja, fast richtig. Wobei utf-8 nur eine von mehreren Möglichkeiten ist, Zeichen zu kodieren. Was JS betrifft: Es gibt:</p> <p>fromCharCode|fromCodePoint charCodeAt|codePointAt</p> <p>wobei die Methods der 2. Spalte zeichenorientiert auf die UTF-8-Kodierung/Codepoint/Unicode zugeschnitten sind. Die Methoden der 1. Spalte hingegen arbeiten sowohl byteorientiert als auch zeichenorientiert.</p> <p>fromCharCode(kleiner 0xFF) wird JS als byte interpretieren, fromCharCode(größer 0xFF) als Zeichen. Auf jeden Fall wird JS einen <code>str = String.fromCodePoint(cp)</code> als Zeichen interpretieren und nicht als Bytefolge.</p> <p>MfG</p> <p>PS: <code>console.log(String.fromCharCode(0xFFFF).length);</code> zeigt 1. D.h., JS meint 1 Zeichen aber es sind 2 bytes. <code>console.log(String.fromCharCode(0xFF).length);</code> zeigt ebenfalls 1 aber es ist eben nur ein byte.</p> Zeichenkodierung Tue, 16 Oct 18 17:58:36 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734349#m1734349 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734349#m1734349 <p>@@dedlfix</p> <blockquote> <p>Das wären dann aber zwei Byte, nicht zwei Zeichen.</p> </blockquote> <p>Wie jetzt, Byte und Zeichen ist nicht dasselbe?? </p> <p>LLAP </p> <div class="signature">-- <br> <em>„Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“</em> —Kurt Weidemann </div> Zeichenkodierung Tue, 16 Oct 18 19:57:49 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734351#m1734351 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734351#m1734351 <p>Hallo dedlfix,</p> <blockquote> <p>Man kann davon ausgehen, dass unter der Haube (…) UTF-16 (…) zum Einsatz kommt.</p> </blockquote> <p>ECMAScript 2018 Spec, Abschnitt 6.1.4: <em>ECMAScript operations that do not interpret String contents apply no further semantics. Operations that do interpret String values treat each element as a single UTF-16 code unit.</em></p> <p>Also ja, man kann ganz gewiss davon ausgehen.</p> <blockquote> <p>String.fromCharCode() kann aber nur die BMP, also Zeichen unterhalb von CodePoint 65536.</p> </blockquote> <p>Ja. Aber da die Basic Multilingual Plane die UTF-16 Surrogatpaare enthält, kann man dank der Spec auch mit CharCodes Codepoint-Scheiße bauen.</p> <pre><code class="block language-js"><span class="token keyword">let</span> shitman <span class="token operator">=</span> String<span class="token punctuation">.</span><span class="token function">fromCharCode</span><span class="token punctuation">(</span><span class="token number">0xd83d</span><span class="token punctuation">,</span> <span class="token number">0xdca9</span><span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>shitman<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// </span> </code></pre> <p>Wer Surrogatpaare nicht im Kopf berechnen kann, kann sie sich über die Gegenrichtung beschaffen.</p> <pre><code class="block language-js"><span class="token keyword">let</span> funnyChar <span class="token operator">=</span> String<span class="token punctuation">.</span><span class="token function">fromCodePoint</span><span class="token punctuation">(</span><span class="token number">0x1F4A9</span><span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>funnyChar<span class="token punctuation">.</span><span class="token function">charCodeAt</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token number">16</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// d83d</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>funnyChar<span class="token punctuation">.</span><span class="token function">charCodeAt</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token number">16</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// dca9</span> </code></pre> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Zeichenkodierung Tue, 16 Oct 18 20:33:31 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734354#m1734354 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734354#m1734354 <p>Hallo pl,</p> <p>NEIIIN!</p> <p>Die charCode Methoden arbeiten auf 16-bit (UTF-16) Werten, die codePoint-Methoden kennen die UTF16 Surrogatpaare und verwenden daher Werte bis 0x10ffff.</p> <p>Dein readAsBinaryString, worüber wir letztens sprachen, liest eine Bytesequenz in einen String, der laut Spec aus 16-bit Werten besteht, die in diesem Fall aber nur mit Werten 0-255 belegt sind.</p> <p>fromCharCode(n) mit n<256 wird von JS NICHT als Byte interpretiert. Sondern immer als Zeichen, gespeichert in 16 Bit. Solange Du innerhalb des String-Objekts bist (sei es nun das String-Objekt oder der primitive string-Typ), hantierst Du nicht mit Bytes.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Zeichenkodierung Tue, 16 Oct 18 20:46:41 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734356#m1734356 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734356#m1734356 <p>hi <a href="/users/6547" class="mention registered-user" rel="noopener noreferrer">@Rolf B</a></p> <blockquote> <p>fromCharCode(n) mit n<256 wird von JS NICHT als Byte interpretiert. Sondern immer als Zeichen, gespeichert in 16 Bit.</p> </blockquote> <p>Es sind nur 8 Bit (1 byte), nicht 16</p> <pre><code class="block language-js"><span class="token keyword">var</span> s <span class="token operator">=</span> String<span class="token punctuation">.</span><span class="token function">fromCharCode</span><span class="token punctuation">(</span><span class="token number">195</span><span class="token punctuation">,</span><span class="token number">164</span><span class="token punctuation">,</span><span class="token number">228</span><span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>s<span class="token punctuation">,</span> s<span class="token punctuation">.</span>length<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// siehst Du</span> <span class="token comment">// ää 3</span> </code></pre> <p>.length ist also die Anzahl der bytes die dabei rauskommen. Ob JS intern da mit 2 byte je byte operiert (UTF16) ist mir vollkommen egal. Ich habe hier Binaries im MB Bereich und die sind absolut bytegenau.</p> <p>MfG</p> <p>PS: Die eigentliche Frage warum JS mit <code>String.fromCharCode(195,164)</code> kein ä zeigt ist übrigens immer noch offen.</p> Zeichenkodierung Wed, 17 Oct 18 02:38:24 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734360#m1734360 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734360#m1734360 <p>moin <a href="/users/6547" class="mention registered-user" rel="noopener noreferrer">@Rolf B</a></p> <blockquote> <p>fromCharCode(n) mit n<256 wird von JS NICHT als Byte interpretiert. Sondern immer als Zeichen, gespeichert in 16 Bit. Solange Du innerhalb des String-Objekts bist (sei es nun das String-Objekt oder der primitive string-Typ), hantierst Du nicht mit Bytes.</p> </blockquote> <p>Ein Blob bringt da Klarheit wieviele bytes es sind:</p> <pre><code class="block language-js"><span class="token keyword">var</span> s <span class="token operator">=</span> String<span class="token punctuation">.</span><span class="token function">fromCharCode</span><span class="token punctuation">(</span><span class="token number">0xA</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">var</span> b <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Blob</span><span class="token punctuation">(</span><span class="token punctuation">[</span>s<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>b<span class="token punctuation">.</span>size<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 1 byte</span> </code></pre> <p>also keine 16 bit sondern nur 8. Wenn es UTF16 wäre, hätte der Blob eine Länge von 2 bytes!</p> <p>MfG</p> Zeichenkodierung Tue, 16 Oct 18 22:41:13 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734358#m1734358 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734358#m1734358 <p>@@pl</p> <blockquote> <p>PS: Die eigentliche Frage warum JS mit <code>String.fromCharCode(195,164)</code> kein ä zeigt ist übrigens immer noch offen.</p> </blockquote> <p>Nein, die ist längst geklärt.</p> <p>Die Frage, die immer noch offen ist, ist die, ob du das jemals verstehen wirst, was es mit Zeichen, Codepoints und Zeichencodierungen auf sich hat.</p> <p>Obwohl – vielleicht ist auch diese Frage längst geklärt.</p> <p>LLAP </p> <div class="signature">-- <br> <em>„Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“</em> —Kurt Weidemann </div> Zeichenkodierung Wed, 17 Oct 18 08:05:11 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734377#m1734377 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734377#m1734377 <p>Hallo pl,</p> <blockquote> <p>Es sind nur 8 Bit (1 byte), nicht 16</p> </blockquote> <p>Falsch.</p> <blockquote> <pre><code class="block language-js"><span class="token keyword">var</span> s <span class="token operator">=</span> String<span class="token punctuation">.</span><span class="token function">fromCharCode</span><span class="token punctuation">(</span><span class="token number">195</span><span class="token punctuation">,</span><span class="token number">164</span><span class="token punctuation">,</span><span class="token number">228</span><span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>s<span class="token punctuation">,</span> s<span class="token punctuation">.</span>length<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// siehst Du</span> <span class="token comment">// ää 3</span> </code></pre> </blockquote> <p>Ich sehe, dass der String 3 <strong>Zeichen</strong> enthält. Und ich weiß, dass diese Zeichen JS-intern 16-bittig gespeichert werden.</p> <p>Das, was passiert wenn Du diesen String in einen Blob legst und ihn per FileReader und seine UTF-8 Codierung mit readAsBinaryString abholst, hat damit nichts zu tun.</p> <blockquote> <p>.length ist also die Anzahl der bytes die dabei rauskommen.</p> </blockquote> <p>Nein. Die Anzahl der Zeichen.</p> <blockquote> <p>Ob JS intern da mit 2 byte je byte operiert (UTF16) ist mir vollkommen egal.</p> </blockquote> <p>Schade. Weil genau das das Thema dieser Diskussion ist.</p> <blockquote> <p>Ich habe hier Binaries im MB Bereich und die sind absolut bytegenau.</p> </blockquote> <p>Sie werden bytegenau als ein Zeichen pro Byte gespeichert. D.h. der „binary string“, den Du aus deinem Binary erhältst, belegt doppelt so viele Bytes wie dein Binary. Das kann Dir egal sein solange es nur ein paar MB sind; es kann Dir nicht egal sein, wenn der Browser 32-bittig läuft und Du in den Bereich von hunderten von MB kommst.</p> <blockquote> <p>PS: Die eigentliche Frage warum JS mit <code>String.fromCharCode(195,164)</code> kein ä zeigt ist übrigens immer noch offen.</p> </blockquote> <p>Nein. Du gibst ihm zwei Bytes eines UTF-8 Encodings, aber führst die Decodierung dieses Encodings nicht durch. Statt dessen bekommst Du gemäß Spec ein JavaScript-Objekt, in dem sich neben Verwaltungsinformationen 4 Bytes mit den Werten 195,0,164,0 befinden (auf einer little-endian Maschine). Es ist ein String in UTF-16 Codierung. Wenn Du UTF-8 decodieren willst, gibt es den TextDecoder, der aber nicht überall verfügbar ist, manuelles Gefummel mit Escape/Unescape-Techniken oder manuelle Interpretation des Encodings (wie Du es schon gezeigt hast). Manuelle Methoden kannst Du auch indirekt anwenden, mittels geeigneter JS Libraries (mutmaßlich StringView.js).</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Zeichenkodierung Wed, 17 Oct 18 06:28:15 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734369#m1734369 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734369#m1734369 <p>hi <a href="/users/20" class="mention registered-user" rel="noopener noreferrer">@Gunnar Bittersmann</a></p> <p>natürlich ist meine Frage längst geklärt. Allerdings hast Du nicht das Geringste dazu beigetragen!</p> <p>MfG</p> Zeichenkodierung Wed, 17 Oct 18 05:23:46 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734364#m1734364 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734364#m1734364 <p>Hallo pl,</p> <blockquote> <p>Ein Blob bringt da Klarheit wieviele bytes es sind:</p> <pre><code class="block language-js"><span class="token keyword">var</span> s <span class="token operator">=</span> String<span class="token punctuation">.</span><span class="token function">fromCharCode</span><span class="token punctuation">(</span><span class="token number">0xA</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">var</span> b <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Blob</span><span class="token punctuation">(</span><span class="token punctuation">[</span>s<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>b<span class="token punctuation">.</span>size<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 1 byte</span> </code></pre> <p>also keine 16 bit sondern nur 8. Wenn es UTF16 wäre, hätte der Blob eine Länge von 2 bytes!</p> </blockquote> <p> </p> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> Zeichenkodierung Wed, 17 Oct 18 06:33:20 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734370#m1734370 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734370#m1734370 <p>Tach!</p> <blockquote> <p>Ein Blob bringt da Klarheit wieviele bytes es sind:</p> <pre><code class="block language-js"><span class="token keyword">var</span> s <span class="token operator">=</span> String<span class="token punctuation">.</span><span class="token function">fromCharCode</span><span class="token punctuation">(</span><span class="token number">0xA</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">var</span> b <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Blob</span><span class="token punctuation">(</span><span class="token punctuation">[</span>s<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>b<span class="token punctuation">.</span>size<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 1 byte</span> </code></pre> <p>also keine 16 bit sondern nur 8. Wenn es UTF16 wäre, hätte der Blob eine Länge von 2 bytes!</p> </blockquote> <p>Falsche Messmethode, falsche Schlussfolgerung. Eine Aussage zum String kann mit dem Blob nicht getroffen werden, denn der Blob-Konstruktor kodiert den String als UTF-8.</p> <p>MDN zum <a href="https://developer.mozilla.org/en-US/docs/Web/API/Blob/Blob" rel="nofollow noopener noreferrer">Blob-Konstruktor</a>: „Parameters: array is an Array of ArrayBuffer, ArrayBufferView, Blob, DOMString objects, or a mix of any of such objects, that will be put inside the Blob. DOMStrings are encoded as UTF-8.“</p> <p>Der letzte Satz ist ein bisschen uneindeutig. Folgt man dem dortigen <a href="https://w3c.github.io/FileAPI/#constructorBlob" rel="nofollow noopener noreferrer">Link zur Spezifikation</a> findet man darin „Append the result of UTF-8 encoding s to bytes.“ Das heißt also nicht, dass DOMStrings UTF-8-kodiert sind, sondern dass das Ergebnis der UTF-8-Kodierung von s (eines der Argumente des o.g. Arrays) zum Ergebnis (bytes: „Let bytes be an empty sequence of bytes“) hinzugefügt wird.</p> <p>MDN zu <a href="https://developer.mozilla.org/en-US/docs/Web/API/DOMString" rel="nofollow noopener noreferrer">DOMString</a>: „DOMString is a UTF-16 String. As JavaScript already uses such strings, DOMString is mapped directly to a String.“</p> <p>Web IDL zu <a href="https://heycam.github.io/webidl/#idl-DOMString" rel="nofollow noopener noreferrer">DOMString</a> (wobei IDL für interface description language steht. Damit werden die Schnittstellen beschrieben, die der Browser zur Verfügung stellt, also der Teil, mit dem Javascript-Code interagiert, wenn man Dinge außerhalb des Javascript-Wirkungsbereiches zu erledigen hat): „The DOMString type corresponds to the set of all possible sequences of code units. Such sequences are commonly interpreted as UTF-16 encoded strings [RFC2781] although this is not required.“</p> <p>Eine Definition von „<a href="http://www.unicode.org/glossary/#code_unit" rel="nofollow noopener noreferrer">code unit</a>“ findet man im Glossar vom Unicode-Konsortium: „The minimal bit combination that can represent a unit of encoded text for processing or interchange. The Unicode Standard uses 8-bit code units in the UTF-8 encoding form, 16-bit code units in the UTF-16 encoding form, and 32-bit code units in the UTF-32 encoding form.“</p> <p>Es hängt also von der konkreten Implementation der Javascript-Engine ab, was da intern verwendet wird. Meist ist es wohl UTF-16.</p> <p>Es bleibt nach wie vor dabei, dass diese Interna für das Arbeiten mit Javascript nicht weiter relevant sind (wenn man nicht gerade einen Schichtensalat zu produzieren versucht). Was an welcher Stelle nach außen hin sichtbar ist, hängt davon ab, was das jeweilige Objekt/Funktion/Methode daraus macht, das man verwendet, und verwenden muss, um mit der Außenwelt zu kommunizieren.</p> <p>dedlfix.</p> Zeichenkodierung Wed, 17 Oct 18 08:07:29 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734378#m1734378 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734378#m1734378 <p>Hallo pl,</p> <p>bei der Ablage in einem Blob wird ein String zu UTF-8 umkodiert. Hatten wir schon.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Zeichenkodierung Wed, 17 Oct 18 05:55:16 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734365#m1734365 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734365#m1734365 <p>@@Christian Kruse</p> <blockquote> <p> </p> </blockquote> <p>Wenn 1000 Worte nicht helfen, ein Bild sagt mehr. </p> <p>LLAP </p> <div class="signature">-- <br> <em>„Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“</em> —Kurt Weidemann </div> Zeichenkodierung Wed, 17 Oct 18 10:41:08 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734393#m1734393 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734393#m1734393 <p>Hallo Gunnar,</p> <p>ein kleines Rechteck sagt mir leider gar nichts (Win7 und Android 6). Welcher Unicode-Codepoint wurde da gewählt? Mr. Shit ist es nicht, den kennt mein Browser.</p> <p>Oder war das kleine Rechteck das beabsichtigte Symbol?</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Zeichenkodierung Wed, 17 Oct 18 06:48:42 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734372#m1734372 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734372#m1734372 <p>@@pl</p> <blockquote> <p>natürlich ist meine Frage längst geklärt. Allerdings hast Du nicht das Geringste dazu beigetragen!</p> </blockquote> <p><a href="https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734208#m1734208" rel="noopener noreferrer">Nicht?</a></p> <p>LLAP </p> <div class="signature">-- <br> <em>„Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“</em> —Kurt Weidemann </div> Zeichenkodierung Wed, 17 Oct 18 10:06:38 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734388#m1734388 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734388#m1734388 <p>hi <a href="/users/6547" class="mention registered-user" rel="noopener noreferrer">@Rolf B</a></p> <p>danke für Deine Info's. Mit Sicherheit kommen wir nun zur Frage der Optimierung, RAM und CPU Gefälligkeit. So wäre die Alternative zum BinaryString Base64, womit die zu speichernde Datenmenge sogar geringfügig kleiner wird. Jedoch ist der Binary String nicht doppelt so lang wie die Binary, was daran liegt, daß es auch bytes mit Wertigkeiten unter 0x80 gibt.</p> <p>Mit Base64 allerdings geht auf meiner alten Kiste die CPU Auslastung durch die Decke, was beim Binary String nicht der Fall ist. In Sachen RAM ergibt sich ein beiden Fällen nur ein Burst der vom Systemmonitor kaum bemerkt wird.</p> <p>Ich tendiere also deutlich zum Binary String und Du?</p> <p>MfG</p> Zeichenkodierung Wed, 17 Oct 18 08:25:34 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734379#m1734379 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734379#m1734379 <p>hi <a href="/users/6547" class="mention registered-user" rel="noopener noreferrer">@Rolf B</a></p> <p>natürlich ist es utf8. Und obwohl JS in <code>String.fromCharCode(0xE2,0x82,0xAC)</code> anstatt des Eurozeichen 3 einzelne utf-8-Zeichen zu erkennen versucht, liefert die Rückrechnung</p> <pre><code class="block language-js"><span class="token keyword">var</span> s <span class="token operator">=</span> String<span class="token punctuation">.</span><span class="token function">fromCharCode</span><span class="token punctuation">(</span><span class="token number">0xE2</span><span class="token punctuation">,</span><span class="token number">0x82</span><span class="token punctuation">,</span><span class="token number">0xAC</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">var</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> s<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span> s<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">charCodeAt</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>dennoch die richtigen Oktettenwertigkeiten für <strong>ein</strong> utf-8-kodiertes Eurozeichen. MfG</p> Zeichenkodierung Wed, 17 Oct 18 10:37:01 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734392#m1734392 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734392#m1734392 <p>Hallo pl,</p> <p>Nein. String.fromCharCode(0xE2,0x82,0xAC) erkennt 3 einzelne UTF-16 Zeichen, weil das die Spec-konforme interne Darstellung von JavaScript-Strings ist. Mit UTF-8 hat diese Funktion nichts am Hut.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Zeichenkodierung Wed, 17 Oct 18 11:57:06 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734400#m1734400 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734400#m1734400 <p>Hallo pl,</p> <p>wenn wir von Optimierung anfangen, müsste ich wissen, was Du eigentlich tust. Bisher haben wir abstrakt über Unicode-Darstellungen gesprochen und ein Beispiel-JS zum Konvertieren in einen „binary string“.</p> <p>Upload eines Files per Ajax wäre sicherlich per XmlHttpRequest.send(file) einfacher, bzw. wenn Du ein Filepaket hochladen willst, durch den send() eines FormData-Objekts in das Du die Files einstellst. Dann läuft alles nativ im Hintergrund, d.h. vor allem SCHNELL, und Du bist mit der Arbeit fertig. Deine Server-Perle ist damit sicherlich auch glücklich.</p> <p>Was machst Du denn eigentlich mit deinem Binary String, wenn Du ihn in den Fingern hast. Wie geht die Verarbeitung weiter?</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Zeichenkodierung Wed, 17 Oct 18 15:58:35 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734412#m1734412 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734412#m1734412 <p>Zum Testen</p> <p><a href="http://rolfrost.de/f.html?b64" rel="nofollow noopener noreferrer">Base64</a></p> <p><a href="http://rolfrost.de/f.html" rel="nofollow noopener noreferrer">String</a></p> <p>Mir scheint, mit String läufts flüssiger, RAM und CPU gefälliger.</p> <p>Bitte mal fredbeck, mfg</p> Zeichenkodierung Wed, 17 Oct 18 10:56:11 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734397#m1734397 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734397#m1734397 <p>@@Rolf B</p> <blockquote> <p>Nein. String.fromCharCode(0xE2,0x82,0xAC) erkennt 3 einzelne UTF-16 Zeichen</p> </blockquote> <p>Ähm, nein. Es gibt ebensowenig UTF-16-Zeichen wie UTF-8-Zeichen. Du meinst: Unicode-Zeichen, kurz: Zeichen?</p> <p>LLAP </p> <div class="signature">-- <br> <em>„Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“</em> —Kurt Weidemann </div> Zeichenkodierung Wed, 17 Oct 18 10:49:18 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734395#m1734395 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734395#m1734395 <p>Hallo</p> <blockquote> <p>ein kleines Rechteck sagt mir leider gar nichts (Win7 und Android 6). Welcher Unicode-Codepoint wurde da gewählt? Mr. Shit ist es nicht, den kennt mein Browser.</p> <p>Oder war das kleine Rechteck das beabsichtigte Symbol?</p> </blockquote> <p>Ne, es ist der Facepalm.</p> <p>Tschö, Auge</p> <div class="signature">-- <br> Eine Kerze stand [auf dem Abort] bereit, und der Almanach des vergangenen Jahres hing an einer Schnur. Die Herausgeber kannten ihre Leser und druckten den Almanach auf weiches, dünnes Papier.<br> Kleine freie Männer von Terry Pratchett </div> Zeichenkodierung Wed, 17 Oct 18 10:52:18 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734396#m1734396 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734396#m1734396 <p>@@Auge</p> <blockquote> <blockquote> <p>ein kleines Rechteck sagt mir leider gar nichts (Win7 und Android 6). Ne, es ist der Facepalm.</p> </blockquote> </blockquote> <p>Immer die Leute mit ihren minderwertigen Systemen. m(</p> <p> </p> <p>LLAP </p> <div class="signature">-- <br> <em>„Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“</em> —Kurt Weidemann </div> Zeichenkodierung Wed, 17 Oct 18 10:59:55 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734398#m1734398 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734398#m1734398 <p>Tach!</p> <blockquote> <blockquote> <p>Nein. String.fromCharCode(0xE2,0x82,0xAC) erkennt 3 einzelne UTF-16 Zeichen</p> </blockquote> <p>Ähm, nein. Es gibt ebensowenig UTF-16-Zeichen wie UTF-8-Zeichen. Du meinst: Unicode-Zeichen, kurz: Zeichen?</p> </blockquote> <p>Nicht ganz, weil diese Funktion nur Zeichen bis CodePoint 65535 erkennt. Das ist eine alte Funktion, aus der Zeit als es nur die BMP gab und Javascript dafür gestrickt wurde. Das moderne Pendant dazu ist String.fromCodePoint() und hat eine etwas eingeschränktere Verfügbarkeit.</p> <p>dedlfix.</p> Zeichenkodierung Wed, 17 Oct 18 12:29:40 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734401#m1734401 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734401#m1734401 <p>Hallo Gunnar,</p> <p>ähm, nein, ich meinte eben NICHT Unicode-Zeichen. Das war nur bis August 1999 so. Im September 1999 kamen mit Unicode 3.0 die Surrogatpaare ins Spiel und JavaScript war mit „ein Unicode-Zeichen passt in 16 Bits“ angeschmiert, genau wie Java und das gerade im Backofen befindliche NGWS (a.k.a Microsoft.Net).</p> <p>Wie ich <a href="https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734351#m1734351" rel="noopener noreferrer">hier</a> schreibte, bekommt fromCharCode UTF-16 Codewörter, von denen die meisten einen gültigen Unicode-Zeichencode darstellen. Aber wenn ich die Nummern von Surrogaten übergebe, dann entsteht das Zeichen erst mittels codePointAt.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Zeichenkodierung Wed, 17 Oct 18 13:03:05 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734403#m1734403 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734403#m1734403 <p>Hi <a href="/users/6547" class="mention registered-user" rel="noopener noreferrer">@Rolf B</a></p> <p>danke der Nachfrage! localStorage speichert leider nur Strings, das ist der einzige Grund der Begehrlichkeit. Es geht also nur ums Speichern wobei die Datenquelle File, Blob oder ArrayBuffer sein kann.</p> <p>MfG</p> Zeichenkodierung Wed, 17 Oct 18 14:30:55 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734409#m1734409 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734409#m1734409 <p>Hallo pl,</p> <p>verstehe. Und wie machst Du das mit dem Rückweg? Aus dem LocalStorage bekommst Du ja den den readAsBinaryStringifizierten Wert zurück, der will wieder ein ArrayBuffer werden. Oder ein Blob. Machst Du das mit dem Iterator-Dings, das ich vorgestern als Schuss aus der Hüfte vorschlug? Oder hast Du was besseres gefunden?</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Zeichenkodierung Wed, 17 Oct 18 14:47:27 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734410#m1734410 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734410#m1734410 <p>hi <a href="/users/6547" class="mention registered-user" rel="noopener noreferrer">@Rolf B</a></p> <p>aus localStorage bekomme ich den String. Hierzu 2 Funktionen:</p> <pre><code class="block language-js"><span class="token comment">// Binary String to ArrayBuffer</span> <span class="token keyword">function</span> <span class="token function">str2ab</span><span class="token punctuation">(</span><span class="token parameter">str</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> buf <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ArrayBuffer</span><span class="token punctuation">(</span>str<span class="token punctuation">.</span>length<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">var</span> bufView <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Uint8Array</span><span class="token punctuation">(</span>buf<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> i<span class="token operator"><</span>str<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> bufView<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> str<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">charCodeAt</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> buf<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// Binary String to Uint8Array</span> <span class="token keyword">function</span> <span class="token function">str2uha</span><span class="token punctuation">(</span><span class="token parameter">str</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> buf <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ArrayBuffer</span><span class="token punctuation">(</span>str<span class="token punctuation">.</span>length<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">var</span> uha <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Uint8Array</span><span class="token punctuation">(</span>buf<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> i<span class="token operator"><</span>str<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> uha<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> str<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">charCodeAt</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> uha<span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Und umgekehrt kommts Dir evntl bekannt vor:</p> <pre><code class="block language-js"><span class="token comment">// Arraybuffer to BinaryString</span> <span class="token keyword">function</span> <span class="token function">ab2str</span><span class="token punctuation">(</span><span class="token parameter">ab</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">var</span> dv <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">DataView</span><span class="token punctuation">(</span>ab<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">var</span> offs <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">var</span> binstr <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span>offs <span class="token operator"><</span> dv<span class="token punctuation">.</span>byteLength <span class="token punctuation">)</span><span class="token punctuation">{</span> binstr <span class="token operator">+=</span> String<span class="token punctuation">.</span><span class="token function">fromCharCode</span><span class="token punctuation">(</span>dv<span class="token punctuation">.</span><span class="token function">getUint8</span><span class="token punctuation">(</span>offs<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> offs <span class="token operator">+=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> binstr<span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Der Rest ist Builtin. MfG</p> Zeichenkodierung Wed, 17 Oct 18 22:09:54 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734419#m1734419 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734419#m1734419 <p>Hallo pl,</p> <p>das ist subjektiv schwer zu sehen, eine integrierte Laufzeitmessung wäre praktisch. Den Speicherverbrauch erkenne ich nicht richtig.</p> <p>Aber mir scheint, dein base64-Encoder hinkt. Mit new String() erzeugst Du einen Wrapper um den primitiven string, und bei jedem Zugriff muss er über den Wrapper laufen. Das macht deinen b64a-String sehr langsam.</p> <p>Ersetze mal <code>b64a: new String('ABC..89+/=')</code> durch <code>b64a: 'ABC..89+/')</code></p> <p>Die Laufzeit drittelt sich fast. Dein Decoder leidet auch an Stringzugriffen, da geht was mit Uint8Array und Lookup-Tables.</p> <p><a href="https://jsfiddle.net/Rolf_b/308zkpyw/" rel="noopener noreferrer">Guck mal hier</a>.</p> <p>Zuerst Deine Klasse, dann meine, dann etwas Testcode. Da ist eine Zuweisung an TestObjekt, da wählst Du aus was verwendet wird. Testgröße gibt an, wie groß der Teststring wird (Testgröße+1 verdoppelt den Teststring). Laufzeitmessungen erscheinen in der Konsole.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Zeichenkodierung Thu, 18 Oct 18 05:39:11 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734422#m1734422 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734422#m1734422 <p>Tach!</p> <blockquote> <p><a href="https://jsfiddle.net/Rolf_b/308zkpyw/" rel="noopener noreferrer">Guck mal hier</a>.</p> </blockquote> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/btoa" rel="nofollow noopener noreferrer">btoa()</a> ist kaputt. Das kann nur Strings mit den Zeichen der CodePoints 0..255 verarbeiten.</p> <p>dedlfix.</p> Zeichenkodierung Thu, 18 Oct 18 08:05:36 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734427#m1734427 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734427#m1734427 <p>hit <a href="/users/6547" class="mention registered-user" rel="noopener noreferrer">@Rolf B</a></p> <p>dank für Dein feedback! Base64.js geändert, new String ersetzt durch ''. Das ergibt eine gefühlte Verbesserung. Ansonsten ist mit Base64 der CPU Burst deutlich größer und hat 2 peaks die wohl encode/decode geschuldet sind.</p> <p>Die Stingvariante hat nur einen peak und sieht im Systemmonitor deutlich ausgeglichener aus. Das Test-Image hat eine Länge 2.295.557 bytes.</p> <p>MfG</p> <p>PS: Meine Bas64.js ist binary safe. Du kannst sie gerne weiter verbessern.</p> Zeichenkodierung Thu, 18 Oct 18 09:35:09 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734430#m1734430 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734430#m1734430 <blockquote> <p><a href="https://jsfiddle.net/Rolf_b/308zkpyw/" rel="noopener noreferrer">Guck mal hier</a>.</p> </blockquote> <p>Kleiner Tipp: Mit <a href="https://developer.mozilla.org/en-US/docs/Web/API/Console/profile" rel="nofollow noopener noreferrer">console.profile</a> erhälst du einen ausführlichen Report, den du mit den Dev-Tools interaktiv auswerten kannst. So kannst du dir die manuellen Messungen sparen.</p> <p>U.a. findet man dort auch diese praktische Ansicht:</p> <p><a href="/images/085528d2-6d27-44f7-86c9-0f7773a5fd85.png" rel="noopener noreferrer"><img src="/images/085528d2-6d27-44f7-86c9-0f7773a5fd85.png?size=medium" alt="Chrome DevTools Beispiel für console.profile" title="Chrome DevTools Beispiel für console.profile" loading="lazy"></a></p> Zeichenkodierung Thu, 18 Oct 18 09:41:45 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734432#m1734432 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734432#m1734432 <p>Hallo dedlfix,</p> <p>das sagen viele, aber die Funktion ist nicht kaputt, sondern funktioniert nach Vorgabe.</p> <p>Meines Wissens ist base64-Codierung definiert als "Verteile 3 Bytes auf 4". Es ist also korrekt, dass btoa keine Unicodezeichen jenseits von \u00ff annimmt. Dafür muss man den Unicode-String erstmal UTF-8 codieren, dann hat man eine Bytesequenz und btoa ist wieder anwendbar.</p> <p>Das Blöde an der Sache ist, dass JavaScript nur einen sehr umständlichen Weg bietet, um an die UTF-8 Codierung einer Ressource heranzukommen. Über Blob und FileReader ist es noch am einfachsten, mit dem Nachteil des „binary string“, der zu 50% aus Totbytes besteht. Eine native Implementierung, die einen ArrayBuffer base64 codiert, scheint zu fehlen. Oder ich bin zu blöd es zu finden :)</p> <p>PLs Anliegen, eine binäre Ressource serialisiert im LocalStorage abzulegen, ist also nicht so ganz trivial. Vielleicht ist das Absicht, und der LocalStorage ist dafür nicht vorgesehen.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Zeichenkodierung Thu, 18 Oct 18 09:36:55 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734431#m1734431 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734431#m1734431 <p>Hallo 1unitedpower,</p> <blockquote> <p>Kleiner Tipp: Mit <a href="https://developer.mozilla.org/en-US/docs/Web/API/Console/profile" rel="nofollow noopener noreferrer">console.profile</a> erhälst du einen ausführlichen Report, den du mit den Dev-Tools interaktiv auswerten kannst. So kannst du dir die manuellen Messungen sparen.</p> </blockquote> <p>Oi - kannte ich tatsächlich auch noch nicht. Neat, danke für den Hinweis!</p> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> Zeichenkodierung Thu, 18 Oct 18 10:36:26 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734436#m1734436 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734436#m1734436 <p>Hallo 1unitedpower,</p> <p>Superhinweis, danke!</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Zeichenkodierung Thu, 18 Oct 18 10:12:51 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734434#m1734434 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734434#m1734434 <p>Tach!</p> <blockquote> <p>das sagen viele, aber die Funktion ist nicht kaputt, sondern funktioniert nach Vorgabe.</p> </blockquote> <p>Ja, so herum stimmt es eher, aber dann muss ich umformulieren, dass du es nicht so verwendet hast, dass es gemäß Vorgabe funktionieren kann.</p> <blockquote> <p>PLs Anliegen, eine binäre Ressource serialisiert im LocalStorage abzulegen, ist also nicht so ganz trivial. Vielleicht ist das Absicht, und der LocalStorage ist dafür nicht vorgesehen.</p> </blockquote> <p>Das ist vermutlich der eigentliche Knackpunkt. Warum soll ein Bild im LocalStorage abgelegt werden, dass von der Quelle bezogen werden kann? Warum will man das dezentral lagern? (Bild bitte als Synonym für alle Daten betrachten, die serverseitig erzeugt wurden.)</p> <p>dedlfix.</p> Zeichenkodierung Thu, 18 Oct 18 14:52:56 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734477#m1734477 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734477#m1734477 <p><a href="/users/6547" class="mention registered-user" rel="noopener noreferrer">@Rolf B</a></p> <blockquote> <p>das sagen viele, aber die Funktion ist nicht kaputt, sondern funktioniert nach Vorgabe.</p> <p>Meines Wissens ist base64-Codierung definiert als "Verteile 3 Bytes auf 4". Es ist also korrekt, dass btoa keine Unicodezeichen jenseits von \u00ff annimmt.</p> </blockquote> <p>Base64 hat mit Unicode überhaupt nichts zu tun. Base64 ist aus UUencode (in Perl Builtin und als u Schablone für pack/unpack implementiert) hervorgegangen und hat das Ziel, bytes beliebiger Wertigkeiten auf den Zeichenvorrat des Base64-Alphabets, was aus 64 Zeichen besteht, daher der Name, abzubilden. Das Mittel zum Zweck sind Bitoperationen.</p> <p>Die Länge einer Binary vergrößert sich durch die Base64 Kodierung um den Faktor 4/3.</p> <blockquote> <p>PLs Anliegen, eine binäre Ressource serialisiert im LocalStorage abzulegen, ist also nicht so ganz trivial.</p> </blockquote> <p>Doch, ist es. Es wird ja nur ein String erzeugt aus Oktettenwertigkeiten die in Containern wie Uint8Array oder ArrayBuffer vorliegen. Angewandt wird dafür String.fromCharCode(x) ganz genauso wie man das in Perl mit chr(x) für jedes einzelne Byte tun würde.</p> <p>MfG</p> Zeichenkodierung Thu, 18 Oct 18 10:34:10 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734435#m1734435 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734435#m1734435 <p>Hallo dedlfix,</p> <blockquote> <p>dass du es nicht so verwendet hast, dass es gemäß Vorgabe funktionieren kann.</p> </blockquote> <p>Hm, eigentlich nicht, aber funktionieren kann es hier. Ich hatte ja einen String aus ASCII-Zeichen. Das war NUR im Testtreiber, nicht in der Base64-Implementierung. Hätte ich mit einem Unicode-String getestet, dann hätte ich vorher UTF-8 codieren müssen. Aber darum ging's ja nicht, sondern nur darum, irgendwie einen fetten Blob zu erschaffen. Er muss ja nicht gleich Dead Ringer For Love oder Somewhere over the Rainbow singen </p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Zeichenkodierung Thu, 18 Oct 18 15:06:18 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734482#m1734482 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734482#m1734482 <p>Tach!</p> <blockquote> <blockquote> <p>Meines Wissens ist base64-Codierung definiert als "Verteile 3 Bytes auf 4". Es ist also korrekt, dass btoa keine Unicodezeichen jenseits von \u00ff annimmt.</p> </blockquote> <p>Base64 hat mit Unicode überhaupt nichts zu tun.</p> </blockquote> <p>Wenn du nicht immer ignorieren würdest, dass Javascript-Strings zeichenorientiert aufgebaut sind, denn würde dir vielleicht auch klar werden, was hier das Problem ist. Die Funktion btoa() nimmt sich ein Zeichen (und kein Byte), bestimmt davon die CodePoint-Nummer und versucht dann daraus die Base64-Ausgabe zu erstellen. Da der Base64-Algorithmus aber nur mit Werten von 0..255 umgehen kann, gibts hier ein Problem mit Zeichen oberhalb von CodePoint 255.</p> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/btoa" rel="nofollow noopener noreferrer">Zitat MDN</a>: The WindowOrWorkerGlobalScope.btoa() method creates a base-64 encoded ASCII string from a String object in which each character in the string is treated as a byte of binary data.</p> <p>Note: Since this function treats each character as a byte of binary data, regardless of the number of bytes which actually make up the character, an InvalidCharacterError exception is thrown if any character's code point is outside the range 0x00 to 0xFF.</p> <p>dedlfix.</p> Zeichenkodierung Thu, 18 Oct 18 15:20:24 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734486#m1734486 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734486#m1734486 <blockquote> <p>Base64 ist aus UUencode (in Perl Builtin und als u Schablone für pack/unpack implementiert) hervorgegangen</p> </blockquote> <p>nein, Base64 stammt von <a href="https://tools.ietf.org/html/rfc989" rel="nofollow noopener noreferrer">PEM</a> ab und das ist älter als perl: „This encoding is virtually identical to the one used in Privacy Enhanced Mail (PEM) applications, as defined in RFC 1421.“ - <a href="https://tools.ietf.org/html/rfc2045#page-24" rel="nofollow noopener noreferrer">https://tools.ietf.org/html/rfc2045#page-24</a></p> Zeichenkodierung Thu, 18 Oct 18 17:31:39 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734506#m1734506 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734506#m1734506 <p>Tach!</p> <blockquote> <p>Note: Since this function treats each character as a byte of binary data, regardless of the number of bytes which actually make up the character, an InvalidCharacterError exception is thrown if any character's code point is outside the range 0x00 to 0xFF.</p> </blockquote> <p>Ok wir übersetzen das mal:</p> <p>Da diese Funktion jedes Zeichen als Binärdatenbyte behandelt, wird unabhängig von der Anzahl der Bytes, aus denen das Zeichen besteht, eine InvalidCharacterError-Ausnahme ausgelöst, wenn der Codepunkt eines Zeichens außerhalb des Bereichs 0x00 bis 0xFF liegt.</p> <p>Also, mal ehrlich, von Fachmann zu Fachmann, soll das ein Witz sein!? Das sind ja mindestens 3 Widersprüche in einem Satz! Da habe ich meine <a href="http://rolfrost.de/Base64.js" rel="nofollow noopener noreferrer">Library</a> schneller in den Editor getippt als über solch einen Schwachsinn nachgedacht.</p> <p>MfG</p> <p>PS: Es gibt immer Gründe für eigene Entwicklungen!</p> Zeichenkodierung Thu, 18 Oct 18 16:34:41 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734495#m1734495 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734495#m1734495 <blockquote> <blockquote> <p>Base64 ist aus UUencode (in Perl Builtin und als u Schablone für pack/unpack implementiert) hervorgegangen</p> </blockquote> <p>nein, Base64 stammt von <a href="https://tools.ietf.org/html/rfc989" rel="nofollow noopener noreferrer">PEM</a> ab und das ist älter als perl: „This encoding is virtually identical to the one used in Privacy Enhanced Mail (PEM) applications, as defined in RFC 1421.“ - <a href="https://tools.ietf.org/html/rfc2045#page-24" rel="nofollow noopener noreferrer">https://tools.ietf.org/html/rfc2045#page-24</a></p> </blockquote> <p>PEM und MIME beschreiben kein Kodierungsverfahren sondern die Anforderung.</p> <p>UUencode, Unix-to-Unix encode, ist so alt wie Unix und auch älter als Base64.</p> <p>MfG</p> <div class="signature">-- <br> Prüfungsfrage bei Cisco: Nennen Sie eine RFC. </div> Zeichenkodierung Thu, 18 Oct 18 16:58:34 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734498#m1734498 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734498#m1734498 <blockquote> <blockquote> <p>nein, Base64 stammt von <a href="https://tools.ietf.org/html/rfc989" rel="nofollow noopener noreferrer">PEM</a> ab und das ist älter als perl: „This encoding is virtually identical to the one used in Privacy Enhanced Mail (PEM) applications, as defined in RFC 1421.“ - <a href="https://tools.ietf.org/html/rfc2045#page-24" rel="nofollow noopener noreferrer">https://tools.ietf.org/html/rfc2045#page-24</a></p> </blockquote> <p>PEM und MIME beschreiben kein Kodierungsverfahren sondern die Anforderung.</p> </blockquote> <p>Da hättest du den Links vielleicht einmal folgen sollen und hättest direkt was gelernt. In beiden RFC werden u.a. Kodierungsverfahren definiert.</p> <blockquote> <p>UUencode, Unix-to-Unix encode, ist so alt wie Unix</p> </blockquote> <p>uuencode ist zwar älter als ich, aber nur von 1980, BSD 4 war wohl das erste UNIX mit uuencode.</p> <blockquote> <p>und auch älter als Base64.</p> </blockquote> <p>Ja, aber nicht der Vorfahr von Base64; möglich dass PEM von uuencode inspiriert war, aber dazu habe ich bisher nix gefunden.</p> Zeichenkodierung Thu, 18 Oct 18 17:33:40 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734508#m1734508 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734508#m1734508 <p>Tach!</p> <blockquote> <p>Also, mal ehrlich, von Fachmann zu Fachmann, soll das ein Witz sein!? Das sind ja mindestens 3 Widersprüche in einem Satz!</p> </blockquote> <p>Die da wären?</p> <p>dedlfix.</p> Zeichenkodierung Thu, 18 Oct 18 18:40:51 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734516#m1734516 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734516#m1734516 <p>Hallo pl,</p> <p>das ist nicht widersprüchlich, das ist einfach die Beschreibung der Einschränkungen, unter denen btoa funktioniert. Du hast ja mir ja beigestimmt, dass Base64 zum Codieren von Bytes gilt. Das muss man den Leuten, die mit Unicode sozialisiert wurden und vor denen Base64 schön in den Tiefen des Netzwerk-Protokolls versteckt wird, nur klar machen. Dazu diese Beschreibung.</p> <p>Ich habe mein Fiddle gerade um eine Zeitmessung von btoa erweitert: Die handgemachte encode-Methode braucht über 1000ms, btoa aber nur 54. Nackig auf dem Metall rennt der Code nun mal schneller, da kommt der JS-JIT nicht mit. Das ist dann der Preis der Eigenentwicklung.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Zeichenkodierung Fri, 19 Oct 18 05:19:12 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734542#m1734542 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734542#m1734542 <p>hi <a href="/users/6547" class="mention registered-user" rel="noopener noreferrer">@Rolf B</a></p> <blockquote> <p>Ich habe mein Fiddle gerade um eine Zeitmessung von btoa erweitert: Die handgemachte encode-Methode braucht über 1000ms, btoa aber nur 54.</p> </blockquote> <p>Das ist ganz toll, nützt aber nichts.</p> <blockquote> <p>Das ist dann der Preis der Eigenentwicklung.</p> </blockquote> <p>Der Preis der Eigenentwicklung ist, daß sie funktioniert!</p> <p>MfG</p> <p>PS: Die Verwandschaft von UUencode und Base64</p> <pre><code class="block language-perl"><span class="token comment"># Binary Eurozeichen erzeugen</span> <span class="token keyword">my</span> <span class="token variable">$bin</span> <span class="token operator">=</span> chr<span class="token punctuation">(</span><span class="token number">0xE2</span><span class="token punctuation">)</span><span class="token operator">.</span>chr<span class="token punctuation">(</span><span class="token number">0x82</span><span class="token punctuation">)</span><span class="token operator">.</span>chr<span class="token punctuation">(</span><span class="token number">0xAC</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment"># Base64 Kodierung</span> <span class="token keyword">my</span> <span class="token variable">$b64</span> <span class="token operator">=</span> encode_base64<span class="token punctuation">(</span><span class="token variable">$bin</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment"># Base64 4oKs</span> <span class="token comment"># Translate to UUencode & Decode</span> <span class="token variable">$b64</span> <span class="token operator">=~</span> <span class="token regex">tr#A-Za-z0-9+/##cd</span><span class="token punctuation">;</span> <span class="token comment"># remove non-base64 chars</span> <span class="token variable">$b64</span> <span class="token operator">=~</span> <span class="token regex">tr#A-Za-z0-9+/# -_#</span><span class="token punctuation">;</span> <span class="token comment"># convert to uuencoded format</span> <span class="token keyword">my</span> <span class="token variable">$len</span> <span class="token operator">=</span> pack<span class="token punctuation">(</span><span class="token string">"c"</span><span class="token punctuation">,</span> <span class="token number">32</span> <span class="token operator">+</span> <span class="token number">0.75</span><span class="token variable">*length</span><span class="token punctuation">(</span><span class="token variable">$b64</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment"># compute length byte</span> <span class="token keyword">print</span> unpack<span class="token punctuation">(</span><span class="token string">"u"</span><span class="token punctuation">,</span> <span class="token variable">$len</span> <span class="token operator">.</span> <span class="token variable">$b64</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment"># Binary €</span> </code></pre> <p><a href="https://www.perlmonks.org/?node=How%20do%20I%20decode%20a%20MIME%2FBASE64%20string%3F" rel="nofollow noopener noreferrer">Qualle</a></p> Zeichenkodierung Fri, 19 Oct 18 07:44:30 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734553#m1734553 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734553#m1734553 <p>hi <a href="/users/6547" class="mention registered-user" rel="noopener noreferrer">@Rolf B</a></p> <p>MDN zu window.btoa: Erzeugt eine Base-64-kodierten ASCII-Zeichenkette aus einer "Zeichenkette" von Binärdaten.</p> <p>PS: mit <code>BinaryString</code> funtioniert auch <code>window.btoa(binary_string)</code> korrekt. Nur mus man den BinaryString ersteinmal haben.</p> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#Solution_.232_.E2.80.93_rewriting_atob()_and_btoa()_using_TypedArrays_and_UTF-8" rel="nofollow noopener noreferrer">Siehe auch</a> womit wir wieder bei String.fromCharCode() wären.</p> <p>Wobei der ebenda gezeigte Umweg über encodeURIComponent() zwar auch ganz toll aber völlig überflüssig ist.</p> Zeichenkodierung Fri, 19 Oct 18 11:52:28 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734597#m1734597 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734597#m1734597 <p>Hallo pl,</p> <blockquote> <p>Nur mus man den BinaryString ersteinmal haben.</p> </blockquote> <p>Ja. Das hatte ich auch schon überlegt. Aber das hängt jetzt von deiner Ausgangsbasis ab. Wenn das eine lokale Datei ist, die in einem <input type=file> selektiert wurde, ist das schon ein Blob (File=Blob). Wenn Du die Ressource per Fetch API vom Server holst (nicht im IE, keine Ahnung ob man das polyfillen kann), kannst Du auf den Response-Objekt aussuchen ob Du einen Blob oder einen ArrayBuffer haben willst. Aber im XMLHttpRequest kannst Du auch zwischen Blob und ArrayBuffer wählen, wenn Du den responseType vorher setzt.</p> <p>Ich hatte heute morgen mein <a href="https://jsfiddle.net/Rolf_b/308zkpyw/10/" rel="noopener noreferrer">Performance-Fiddle</a> nochmal umgeschrieben. Es ist jetzt Promise-gesteuert, was den serialisierten Umgang mit FileReader einfacher macht, und da ist jetzt auch eine Messung von btoa drin. Das Ding ist grob acht- bis zehnmal schneller als der handgemachte Encode, auch wenn man die Konvertierung ArrayBuffer->BinaryString mitmisst.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Zeichenkodierung Fri, 19 Oct 18 12:06:17 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734599#m1734599 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734599#m1734599 <p>hi <a href="/users/6547" class="mention registered-user" rel="noopener noreferrer">@Rolf B</a></p> <p>den MDN Vorschlag hab ich doch gleich <a href="http://rolfrost.de/jsbinstr.html" rel="nofollow noopener noreferrer">hier</a> verwurstet. Das macht direkt aus einer Zeichenkette einen Binary String ohne Filereader.</p> <p>Aber JS kennt ja keine Bytes, sondern nur Zeichen nunja. Ich für meinen Teil bleibe bei meinen Begrifflichkeiten, die habe ich von Perl.</p> <p>MfG</p> Zeichenkodierung Sun, 21 Oct 18 10:58:59 Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734748#m1734748 https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734748#m1734748 <p>Hello,</p> <blockquote> <p>Aber JS kennt ja keine Bytes, sondern nur Zeichen nunja. Ich für meinen Teil bleibe bei meinen Begrifflichkeiten, die habe ich von Perl.</p> </blockquote> <p>Layer 6 + 7<br> Wo findest Du da Bytes?</p> <p>Glück Auf<br> Tom vom Berg</p> <div class="signature">-- <br> Es gibt nichts Gutes, außer man tut es!<br> Das Leben selbst ist der Sinn.<br> </div>