см. мой выше редактировать для ответа на это.

о-нибудь есть идея, как визуализировать символы юникода «астральная плоскость» (чьи CID превышают 0xffff) в google v8, javascript vm, который управляет как Google Chrome, так и nodejs?

как ни странно, когда я даю Google Chrome (он идентифицируется как 11.0.696.71, работает на Ubuntu 10.4) html-страницу, например:

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

он будет правильно отображать 'широкий' символ вместе с 'узким', но когда я попробую эквивалент в nodejs (используяconsole.log()) вместо этого я получаю один (0xfffd, ЗАМЕНЯЮЩИЙ ХАРАКТЕР) для «широкого» символа.

Мне также сказали, что по какой-то непонятной причине Google решил реализовать символы, используя 16-битный тип данных. пока я нахожу это глупым,суррогатные кодовые точки были разработаны именно для того, чтобы обеспечить «направление» «астральных кодовых точек» через 16-битные пути. и каким-то образом v8, работающий внутри chrome 11.0.696.71, похоже, использует этот бит unicode-foo или другой магии для своей работы (кажется, я помню, много лет назад у меня всегда были коробки вместо этого даже на статических страницах).

о да,node --version отчетыv0.4.10Должен выяснить, как получить номер версии V8 из этого.

Обновить я сделал в кофе-скрипте следующее:

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 )

но это только дает мне

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

Мысль, стоящая за этим, заключается в том, что, поскольку та мозговая часть спецификации javascript, которая имеет дело с юникодом, кажется, обязательна? / не прямо запретить? / позволяет? использование суррогатных пар, тогда, возможно, моя кодировка исходного файла (utf-8) может быть частью проблемы. в конце концов, есть два способа кодирования 32-битных кодовых точек в utf-8: один - два, записывают октеты utf-8, необходимые для первого суррогата, затем для второго; Другой способ (который является предпочтительным способом согласно спецификации utf-8) - вычислить результирующую кодовую точку и выписать октеты, необходимые для этой кодовой точки. поэтому здесь я полностью исключаю вопрос кодировки исходного файла, имея дело только с числами. приведенный выше код работает сdocument.write() в хроме, дачетак что я знаю, что я правильно понял цифры.

вздох.

РЕДАКТИРОВАТЬ Я провел несколько экспериментов и обнаружил, что когда я делаю

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 ) );

я получаю правильные результаты в Google Chrome --- как в окне браузера, так и на консоли:


2
0xd864
0xdd0e

2
0xd864
0xdd0e

Тем не менее, это то, что я получаю при использовании nodejsconsole.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>

это, кажется, указывает, что оба разбора utf-8 с CID вне0xffff и вывод этих символов в консоль не работает. Кстати, python 3.1 рассматривает персонажа как суррогатную пару и может выводить символ в консоль.

НОТА я поставил этот вопрос наСписок рассылки v8-пользователей.

Ответы на вопрос(2)

Ваш ответ на вопрос