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.