Wstaw znak Unicode do JavaScript

137

Muszę wstawić Omega (Ω) na moją stronę HTML. W tym celu używam jego kodu ucieczki HTML, więc mogę pisać Ωi pobierać Ω. Wszystko jest w porządku, kiedy umieszczam to w elemencie HTML; Jednak kiedy próbuję umieścić go w moim JS, np var Omega = Ω. analizuje ten kod jako JS i całość nie działa. Czy ktoś wie, jak się do tego zabrać?

Niebieski ogień
źródło
15
var Omega = "Ω";zbyt proste?
Heretic Monkey
6
Notatnik tego nie akceptuje, po prostu pisze O: P
Bluefire
13
@MikeMcCaughan Tak, ale jeśli inny programista pomyli się z kodowaniem pliku źródłowego, straciłeś ... Zawsze będziesz miał kogoś, kto powie „OOOOps Nie wiedziałem, że <element zastępczy dla oprogramowania> używa CP1250 jako domyślnego kodowania i nie zauważył tej małej zmiany przy zatwierdzaniu "lub" znak enco-co? " ; =)
Samuel Rossille
3
@Bluefire przełącz się na lepszy edytor tekstu, który obsługuje ustawienie kodowania znaków (np. Notepad ++) i ustaw go na UTF-8. Następnie możesz napisać chiński w swoim kodzie źródłowym, jeśli chcesz ... Lub pozostań w kategorii ppl, do której skierowany jest mój pierwszy komentarz; =) en.wikipedia.org/wiki/Character_encoding
Samuel Rossille
4
@Bluefire, Notepad ++ powinien sobie z tym poradzić, wystarczy zmienić kodowanie w menu na UTF-8 lub UCS-2.
Heretic Monkey

Odpowiedzi:

204

Zgaduję, że faktycznie chcesz Omegabyć łańcuchem zawierającym omegę z wielkiej litery? W takim przypadku możesz napisać:

var Omega = '\u03A9';

(Ponieważ Ω jest znakiem Unicode z punktem kodowym U + 03A9 ; to 03A9znaczy 937, z wyjątkiem zapisanego jako cztery cyfry szesnastkowe).

ruakh
źródło
4
A jeśli ktoś chce się dowiedzieć, jaka jest wartość szesnastkowa dla ciągu znaków Unicode: mothereff.in/js-escapes
StanE
Innym sposobem wyprowadzenia wartości szesnastkowej dla ciągu znaków Unicode z poziomu JavaScript jest: „Ω” .codePointAt (0) .toString (16);
KostasX
55

Chociaż @ruakh udzielił dobrej odpowiedzi, dodam kilka alternatyw dla kompletności:

W rzeczywistości możesz użyć nawet var Omega = '&#937;'w JavaScript, ale tylko wtedy, gdy twój kod JavaScript to:

  • wewnątrz atrybutu zdarzenia, jak w onclick="var Omega = '&#937'; alert(Omega)"lub
  • w scriptelemencie wewnątrz dokumentu XHTML (lub XHTML + XML) udostępnianego z treścią typu XML.

W takich przypadkach kod zostanie najpierw (przed przekazaniem do interpretera JavaScript) przeanalizowany przez parser HTML, aby &#937;rozpoznawane były odniesienia do znaków, takie jak . Ograniczenia sprawiają, że w większości przypadków jest to niepraktyczne podejście.

Możesz również wpisać znak Ω jako taki, jak in var Omega = 'Ω', ale wtedy kodowanie znaków musi na to pozwalać, kodowanie musi być poprawnie zadeklarowane i potrzebujesz oprogramowania, które pozwoli ci wprowadzić takie znaki. Jest to czyste rozwiązanie i całkiem wykonalne, jeśli używasz kodowania UTF-8 do wszystkiego i jesteś przygotowany do radzenia sobie z tworzonymi przez nie problemami. Kod źródłowy będzie czytelny, a czytając go, od razu zobaczysz sam znak, zamiast notacji kodu. Z drugiej strony może to spowodować niespodzianki, jeśli inne osoby zaczną pracować z Twoim kodem.

Używanie \unotacji, jak w var Omega = '\u03A9', działa niezależnie od kodowania znaków i jest w praktyce prawie uniwersalne. Może być jednak jako taki używany tylko do U + FFFF, tj. Do \uffff, ale większość postaci, o których większość ludzi kiedykolwiek słyszała, należy do tego obszaru. (Jeśli potrzebujesz „wyższych” znaków, musisz użyć par zastępczych lub jednego z dwóch powyższych podejść).

Możesz również skonstruować znak za pomocą String.fromCharCode()metody, przekazując jako parametr numer Unicode, dziesiętnie var Omega = String.fromCharCode(937)lub szesnastkowo, jak w var Omega = String.fromCharCode(0x3A9). Działa to do U + FFFF. Tego podejścia można użyć nawet wtedy, gdy w zmiennej znajduje się numer Unicode.

Jukka K. Korpela
źródło
19
Czasy się zmieniły teraz, 5 lat później ludzie używają tych rzeczy zwanych „emoji” poza U+FFFFzasięgiem. JavaScript też ma, więc możesz to zrobić. var poop = '\u{1F4A9}';
Użytkownik, który nie jest użytkownikiem
1
@Userthatisnotauser i to powinna być zaakceptowana odpowiedź!
Marten Koetsier
Jak wstawić znak „otwartej kłódki” „\ uD83D \ uDD13” za pomocą kodu „0x1F512” w JavaScript? Dlaczego potrzebujemy dwóch kodów, aby wstawić jeden znak?
tarekahf
6
@tarekahf Oto krótka lekcja na temat Unicode. UTF-16 obejmował tylko punkty Unicode od U + 0000 do U + FFFF. Potem rozrósł się Unicode i wynaleziono surogaty, aby UTF-16 mógł uzyskać dostęp do tych punktów. Ale JavaScript może to zrobić teraz: var lock = '\u{1F512}'Otrzymujesz to: 🔓
Użytkownik, który nie jest użytkownikiem.
5

Odpowiedź jest prawidłowa, ale nie musisz deklarować zmiennej. Ciąg może zawierać twój znak:

"This string contains omega, that looks like this: \u03A9"

Niestety nadal te kody w ASCII są potrzebne do wyświetlania UTF-8, ale wciąż czekam (od zbyt wielu lat ...) na dzień, w którym UTF-8 będzie taki sam jak był ASCII, a ASCII będzie tylko wspomnieniem przeszłość.

fresko
źródło
10
Emotikony sprawiają, że te kody są jeszcze trudniejsze do wpisania! \u{1F641}= 🙁
Użytkownik, który nie jest użytkownikiem
2

Jedną z opcji jest dosłowne umieszczenie znaku w skrypcie, np .:

const omega = 'Ω';

Wymaga to poinformowania przeglądarki o prawidłowym kodowaniu źródła, patrz Unicode w JavaScript

Jeśli jednak nie możesz lub nie chcesz tego zrobić (np. Ponieważ znak jest zbyt egzotyczny i nie można oczekiwać, że będzie dostępny w czcionce edytora kodu), najbezpieczniejszą opcją może być użycie ciągu w nowym stylu ucieczka lub String.fromCodePoint:

const omega = '\u{3a9}';

// or:

const omega = String.fromCodePoint(0x3a9);

Nie jest to ograniczone do UTF-16, ale działa dla wszystkich punktów kodowych Unicode. Dla porównania, inne wymienione tutaj podejścia mają następujące wady:

  • Ucieczki HTML ( const omega = '&#937';): działają tylko wtedy, gdy są renderowane bez zmiany znaczenia w elemencie HTML
  • const omega = '\u03A9';znaki ucieczki w starym stylu ( ): ograniczone do UTF-16
  • String.fromCharCode: ograniczone do UTF-16
coldfix
źródło