2013-03-03 10 views
17

następujące nie wydaje się prawidłoweJavascript "" .charCodeAt (0) utknął w 55357?

"".charCodeAt(0); // returns 55357 in both Firefox and Chrome 

że to postać o imieniu ROCKET Unicode (U + 1F680), dziesiętny powinien być 128640.

To jest dla piszę unicode aplikacji. Wydaje się, że większość znaków, ale nie wszystkie znaki z Unicode 6 utknęły w 55357.

jak mogę to naprawić? Dzięki.

+5

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/charCodeAt –

+0

najlepsza odpowiedź. thx @JoshLee –

+0

@XahLee, to był komentarz, a nie odpowiedź. Proszę oznaczyć najlepszą * odpowiedź * jako zaakceptowaną. –

Odpowiedz

9

JavaScript używa kodowania UTF-16; patrz this article, aby uzyskać szczegółowe informacje:

Znaki spoza BMP, np. Tetragram U + 1D306 dla centrum(), może być zakodowany tylko w UTF-16 przy użyciu dwóch 16-bitowych jednostek kodu: 0xD834 0xDF06. Nazywa się to zastępczą parą. Zauważ, że zastępcza para reprezentuje tylko jeden znak.

Pierwsza jednostka kodowa zastępczej pary jest zawsze w zakresie od 0xD800 do 0xDBFF i jest nazywana surogatem zastępczym lub wiodącym surogatem.

Druga jednostka kodu zastępczej pary jest zawsze w zakresie od 0xDC00 do 0xDFFF i jest nazywana surogatem niskim lub surogatem szlaku.

można dekodować zastępczą parę tak:

codePoint = (text.charCodeAt(0) - 0xD800) * 0x400 + text.charCodeAt(1) - 0xDC00 + 0x10000 

Kompletny kod można znaleźć można znaleźć w Mozilla documentation for charCodeAt.

+0

wszystkie świetne odpowiedzi. Link do Josha Lee do https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/charCodeAt, który zawiera kod, który rozwiązuje problem. –

+0

Daniel, czy rozważyłbyś dodanie linku do Mozilli? ponieważ zawiera działający kod. dzięki. –

0

Myślę, że to dlatego, że zwracają ci pierwsze kodowanie UTF-16 jednostki kodu tej postaci. Nie jestem pewien, czy możesz zrobić wiele, ponieważ zwracają 16-bitową wartość - prawdopodobnie spróbowałbym ręcznie odkodować znak z pierwszych dwóch jednostek kodu, a następnie zakodować go w UTF-32, który wydaje się być czego chcesz.

Powiązane problemy