tag:forum.selfhtml.org,2005:/self Zeichenkodierung – SELFHTML-Forum 2018-10-21T10:58:59Z https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734206#m1734206 pl 2018-10-15T06:03:28Z 2018-10-15T06:04:47Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734207#m1734207 Christian Kruse https://wwwtech.de/about 2018-10-15T06:06:17Z 2018-10-15T06:06:17Z Zeichenckodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734208#m1734208 Gunnar Bittersmann selfhtml@bittersmann.de https://bittersmann.de 2018-10-15T06:11:54Z 2018-10-15T06:11:54Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734211#m1734211 MudGuard http://www.andreas-waechter.de/ 2018-10-15T06:42:39Z 2018-10-15T06:42:39Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734284#m1734284 Rolf B 2018-10-15T13:01:35Z 2018-10-15T13:01:35Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734294#m1734294 TS ts-self@online.de https://bitworks.de 2018-10-15T17:50:33Z 2018-10-15T17:50:33Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734292#m1734292 pl 2018-10-15T14:37:31Z 2018-10-15T14:37:31Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734298#m1734298 Gunnar Bittersmann selfhtml@bittersmann.de https://bittersmann.de 2018-10-15T18:15:38Z 2018-10-15T19:05:01Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734299#m1734299 dedlfix 2018-10-15T19:02:42Z 2018-10-15T19:02:42Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734306#m1734306 pl 2018-10-16T06:17:30Z 2018-10-16T06:17:30Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734307#m1734307 Rolf B 2018-10-16T06:53:14Z 2018-10-16T06:53:14Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734312#m1734312 Gunnar Bittersmann selfhtml@bittersmann.de https://bittersmann.de 2018-10-16T08:35:34Z 2018-10-16T08:35:34Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734337#m1734337 pl http://rolfrost.de/brd.html 2018-10-16T15:09:12Z 2018-10-16T15:09:12Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734313#m1734313 Rolf B 2018-10-16T08:54:48Z 2018-10-16T09:00:36Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734314#m1734314 usb 2018-10-16T08:58:29Z 2018-10-16T08:58:29Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734316#m1734316 Rolf B 2018-10-16T09:07:48Z 2018-10-16T09:07:48Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734322#m1734322 usb 2018-10-16T10:16:52Z 2018-10-16T10:16:52Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734326#m1734326 Rolf B 2018-10-16T10:34:35Z 2018-10-16T10:36:53Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734340#m1734340 Rolf B 2018-10-16T15:59:47Z 2018-10-16T16:10:28Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734345#m1734345 pl http://rolfrost.de/brd.html 2018-10-16T16:51:43Z 2018-10-16T16:55:02Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734347#m1734347 Patrick C. 2018-10-16T17:27:41Z 2018-10-16T17:27:41Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734348#m1734348 dedlfix 2018-10-16T17:52:02Z 2018-10-16T17:52:02Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734353#m1734353 pl http://rolfrost.de/brd.html 2018-10-16T20:20:39Z 2018-10-16T20:29:09Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734349#m1734349 Gunnar Bittersmann selfhtml@bittersmann.de https://bittersmann.de 2018-10-16T17:58:36Z 2018-10-16T17:58:36Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734351#m1734351 Rolf B 2018-10-16T19:57:49Z 2018-10-16T19:57:49Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734354#m1734354 Rolf B 2018-10-16T20:33:31Z 2018-10-16T20:33:31Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734356#m1734356 pl http://rolfrost.de/brd.html 2018-10-16T20:46:41Z 2018-10-16T20:56:05Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734360#m1734360 pl http://rolfrost.de/brd.html 2018-10-17T02:38:24Z 2018-10-17T02:42:36Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734358#m1734358 Gunnar Bittersmann selfhtml@bittersmann.de https://bittersmann.de 2018-10-16T22:41:13Z 2018-10-16T22:41:13Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734377#m1734377 Rolf B 2018-10-17T08:05:11Z 2018-10-17T08:06:04Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734369#m1734369 pl http://rolfrost.de/brd.html 2018-10-17T06:28:15Z 2018-10-17T06:28:15Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734364#m1734364 Christian Kruse https://wwwtech.de/about 2018-10-17T05:23:46Z 2018-10-17T05:23:46Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734370#m1734370 dedlfix 2018-10-17T06:33:20Z 2018-10-17T06:33:20Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734378#m1734378 Rolf B 2018-10-17T08:07:29Z 2018-10-17T08:07:29Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734365#m1734365 Gunnar Bittersmann selfhtml@bittersmann.de https://bittersmann.de 2018-10-17T05:55:16Z 2018-10-17T05:55:16Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734393#m1734393 Rolf B 2018-10-17T10:41:08Z 2018-10-17T10:41:08Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734372#m1734372 Gunnar Bittersmann selfhtml@bittersmann.de https://bittersmann.de 2018-10-17T06:48:42Z 2018-10-17T06:48:42Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734388#m1734388 pl http://rolfrost.de/brd.html 2018-10-17T10:06:38Z 2018-10-17T10:22:58Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734379#m1734379 pl http://rolfrost.de/brd.html 2018-10-17T08:25:34Z 2018-10-17T08:25:34Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734392#m1734392 Rolf B 2018-10-17T10:37:01Z 2018-10-17T10:37:01Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734400#m1734400 Rolf B 2018-10-17T11:57:06Z 2018-10-17T11:57:06Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734412#m1734412 pl http://rolfrost.de/brd.html 2018-10-17T15:58:35Z 2018-10-17T15:58:35Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734397#m1734397 Gunnar Bittersmann selfhtml@bittersmann.de https://bittersmann.de 2018-10-17T10:56:11Z 2018-10-17T10:56:11Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734395#m1734395 Auge 2018-10-17T10:49:18Z 2018-10-17T10:49:18Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734396#m1734396 Gunnar Bittersmann selfhtml@bittersmann.de https://bittersmann.de 2018-10-17T10:52:18Z 2018-10-17T10:52:18Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734398#m1734398 dedlfix 2018-10-17T10:59:55Z 2018-10-17T10:59:55Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734401#m1734401 Rolf B 2018-10-17T12:29:40Z 2018-10-17T12:29:40Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734403#m1734403 pl http://rolfrost.de/brd.html 2018-10-17T13:03:05Z 2018-10-17T13:10:13Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734409#m1734409 Rolf B 2018-10-17T14:30:55Z 2018-10-17T14:30:55Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734410#m1734410 pl http://rolfrost.de/brd.html 2018-10-17T14:47:27Z 2018-10-17T14:48:41Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734419#m1734419 Rolf B 2018-10-17T22:09:54Z 2018-10-17T22:09:54Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734422#m1734422 dedlfix 2018-10-18T05:39:11Z 2018-10-18T05:39:11Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734427#m1734427 pl http://rolfrost.de/brd.html 2018-10-18T08:05:36Z 2018-10-18T08:05:36Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734430#m1734430 1unitedpower 2018-10-18T09:35:09Z 2018-10-18T09:35:09Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734432#m1734432 Rolf B 2018-10-18T09:41:45Z 2018-10-18T09:41:45Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734431#m1734431 Christian Kruse https://wwwtech.de/about 2018-10-18T09:36:55Z 2018-10-18T09:36:55Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734436#m1734436 Rolf B 2018-10-18T10:36:26Z 2018-10-18T10:36:26Z Zeichenkodierung <p>Hallo 1unitedpower,</p> <p>Superhinweis, danke!</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734434#m1734434 dedlfix 2018-10-18T10:12:51Z 2018-10-18T10:12:51Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734477#m1734477 pl http://rolfrost.de/brd.html 2018-10-18T14:52:56Z 2018-10-18T14:52:56Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734435#m1734435 Rolf B 2018-10-18T10:34:10Z 2018-10-18T10:34:10Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734482#m1734482 dedlfix 2018-10-18T15:06:18Z 2018-10-18T15:06:18Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734486#m1734486 usb 2018-10-18T15:20:24Z 2018-10-18T15:20:24Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734506#m1734506 pl http://rolfrost.de/brd.html 2018-10-18T17:31:39Z 2018-10-18T17:32:23Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734495#m1734495 pl http://rolfrost.de/brd.html 2018-10-18T16:34:41Z 2018-10-18T16:34:41Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734498#m1734498 usb 2018-10-18T16:58:34Z 2018-10-18T16:59:26Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734508#m1734508 dedlfix 2018-10-18T17:33:40Z 2018-10-18T17:33:40Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734516#m1734516 Rolf B 2018-10-18T18:40:51Z 2018-10-18T18:40:51Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734542#m1734542 pl http://rolfrost.de/brd.html 2018-10-19T05:19:12Z 2018-10-19T05:26:26Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734553#m1734553 pl http://rolfrost.de/brd.html 2018-10-19T07:44:30Z 2018-10-19T07:52:36Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734597#m1734597 Rolf B 2018-10-19T11:52:28Z 2018-10-19T11:52:28Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734599#m1734599 pl http://rolfrost.de/brd.html 2018-10-19T12:06:17Z 2018-10-19T12:06:17Z Zeichenkodierung <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> https://forum.selfhtml.org/self/2018/oct/15/zeichenckodierung/1734748#m1734748 TS ts-self@online.de https://bitworks.de 2018-10-21T10:58:59Z 2018-10-21T10:58:59Z Zeichenkodierung <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>