wie Erzeuge 32bit unicode-Zeichen in google v8 (und nodejs)

hat jemand eine Idee, wie das zu Rendern unicode 'Astralebene' - Zeichen (Zeichen, deren CIDs sind über 0xffff) in google v8, die javascript-vm-Laufwerke, die sowohl google chrome und nodejs?

komischerweise, wenn ich google chrome (es identifiziert sich als 11.0.696.71, läuft auf ubuntu 10.4) eine html-Seite wie diese:

<script>document.write( "helo" )
document.write( "? ⿸?子" );
</script>

wird es richtig Rendern der 'wide' - Charakter ? zusammen mit dem "narrow", aber wenn ich versuche, den Gegenwert in nodejs (mit console.log()) bekomme ich eine einzelne � (0xfffd, ERSATZ-ZEICHEN) für die 'wide' - Charakter statt.

habe ich auch schon gesagt, dass für was auch immer nicht verständlichen Grund, warum google hat beschlossen, die Zeichen durch eine 16-bit breiten Datentyp. während ich finde, dass die doof, die surrogate Codepoint wurde entworfen, genau, um Sie aktivieren die 'Kanalisierung' der 'astral-codepoints' durch 16bit-herausgefordert Wege. und irgendwie ist die v8-Ausführung in chrome 11.0.696.71 scheint die Verwendung dieses bit unicode-foo oder anderen Zauber um seine Arbeit zu tun (ich glaube mich zu erinnern, vor Jahren bekam ich immer Boxen, statt selbst auf statischen Seiten).

ah ja, node --version Berichte v0.4.10, ich muss herausfinden, wie Sie erhalten einen v8-version Anzahl von.

update habe ich Folgendes in coffee-script:

a = String.fromCharCode( 0xd801 )
b = String.fromCharCode( 0xdc00 )
c = a + b
console.log a
console.log b
console.log c
console.log String.fromCharCode( 0xd835, 0xdc9c )

aber, dass nur gibt mir

���
���
������
������

der Gedanke dahinter ist, dass seit braindead Teil der javascript-Spezifikation, die sich mit unicode scheint Mandat? /nicht geradezu verbieten? /können? die Verwendung von Surrogat-Paaren, die dann vielleicht meine Quelle-Datei-Codierung (utf-8), könnte ein Teil des Problems. nachdem alle, es gibt zwei Möglichkeiten, um zu Kodieren, 32-bit codepoints in utf-8: einer ist zwei zu schreiben, die die utf-8 Bytes benötigt für die erste Leihmutter, dann jene für die zweite; auf die andere Weise (das ist der bevorzugte Weg, nach utf-8 spec) ist zur Berechnung der resultierenden codepoint und schreibt die Bytes benötigt codepoint. so hier habe ich komplett ausschließen, die Frage nach der Quelle-Datei-Codierung durch den Umgang nur mit zahlen. der obige code funktioniert mit document.write() im chrome, was ??, so weiß ich, ich habe die zahlen Recht.

Seufzer.

BEARBEITEN ich habe einige Experimente und fand heraus, dass wenn ich

var f = function( text ) {
  document.write( '<h1>',  text,                                '</h1>'  );
  document.write( '<div>', text.length,                         '</div>' );
  document.write( '<div>0x', text.charCodeAt(0).toString( 16 ), '</div>' );
  document.write( '<div>0x', text.charCodeAt(1).toString( 16 ), '</div>' );
  console.log( '<h1>',  text,                                 '</h1>'  );
  console.log( '<div>', text.length,                          '</div>' );
  console.log( '<div>0x', text.charCodeAt(0).toString( 16 ),  '</div>' );
  console.log( '<div>0x', text.charCodeAt(1).toString( 16 ),  '</div>' ); };

f( '?' );
f( String.fromCharCode( 0xd864, 0xdd0e ) );

bekomme ich die richtigen Ergebnisse in der google chrome---innerhalb des browser-Fensters und auf der Konsole:

?
2
0xd864
0xdd0e
?
2
0xd864
0xdd0e

dies ist jedoch, was ich bekomme, wenn mit nodejs' console.log:

<h1>  </h1>
<div> 1 </div>
<div>0x fffd </div>
<div>0x NaN </div>
<h1> �����</h1>
<div> 2 </div>
<div>0x d864 </div>
<div>0x dd0e </div>

dies scheint darauf hinzudeuten, dass beide analysieren utf-8 mit CIDs über 0xffff und Ausgabe diese Zeichen auf der Konsole gebrochen ist. python 3.1, durch die Art und Weise, behandelt Sie die Zeichen der surrogate-pair-Mädchen und drucken können charactr auf der Konsole.

HINWEIS ich habe cross-gepostet diese Frage an die v8-users-mailing-Liste.

  • Es gibt nur eine Art zu Kodieren, die Skalare Werte in UTF-8, nämlich die "zweiten Weg". Der "erste Weg" ist illegal.
InformationsquelleAutor flow | 2011-08-08
Schreibe einen Kommentar