Supporto Unicode in vari linguaggi di programmazione
-
10-07-2019 - |
Domanda
Vorrei avere un posto canonico per mettere in comune le informazioni sul supporto Unicode in varie lingue. Fa parte del linguaggio principale? Viene fornito nelle biblioteche? Non è affatto disponibile? Esiste una risorsa popolare per le informazioni Unicode in una lingua? Una lingua per risposta, per favore. Inoltre, se potessi rendere la lingua un'intestazione che faciliterebbe la ricerca.
Nessuna soluzione corretta
Altri suggerimenti
Perl
Perl ha il supporto Unicode integrato, principalmente. Una specie di. Da perldoc:
- perlunitut - Tutorial sull'uso di Unicode in Perl. Insegna ampiamente in termini assoluti su cosa dovresti e non dovresti fare fino a Unicode. Nozioni di base sulle copertine.
- perlunifaq - Domande frequenti su Unicode in Perl.
- perluniintro - Introduzione a Unicode in Perl. Meno "predicato" di perlunitut .
- perlunicode - Per quando devi assolutamente sapere tutto quello che c'è da sapere su Unicode e Perl .
Python 3k
Python 3k (o 3.0 o 3000) ha un nuovo approccio per la gestione di testo (unicode) e dati:
Testo vs. Dati anziché Unicode vs. 8-bit. Vedi anche Unicode HOWTO .
Java
Come per .NET, Java utilizza UTF-16 internamente: java.lang.String
Una
String
rappresenta una stringa nel formato UTF-16 in cui caratteri supplementari sono rappresentati da coppie surrogate (vedere la sezione Rappresentazioni di caratteri Unicode nelCarattere
per ulteriori informazioni). I valori dell'indice si riferiscono alle unità di codicechar
, quindi un carattere supplementare utilizza due posizioni in unaString
.
HQ9 +
Il comando Q ha il supporto Unicode completo nella maggior parte delle implementazioni.
Delphi
Delphi 2009 supporta pienamente Unicode. Hanno modificato l'implementazione di string
in modo predefinito con codifica Unicode a 16 bit e la maggior parte delle librerie, comprese quelle di terze parti, supporta Unicode. Vedi Delphi e Unicode di Marco Cantù.
Prima di Delphi 2009, il supporto per Unicode era limitato, ma c'erano WideChar
e WideString
per memorizzare la stringa codificata a 16 bit. Vedi Unicode in Delphi per maggiori informazioni.
Nota, puoi ancora sviluppare un'applicazione CJKV bilingue senza usare Unicode. Ad esempio, Shift JIS per la stringa codificata per il giapponese può essere archiviata usando AnsiString semplice
.
Vai
Il linguaggio di programmazione Go di Google supporta Unicode e funziona con UTF-8.
Python
Python 2 ha le classi str
e unicode
. Gli oggetti str
memorizzano i byte, gli oggetti unicode
memorizzano i caratteri UTF-16. La maggior parte delle funzioni di libreria supportano entrambi (ad es. os.listdir ('.')
restituisce un elenco di str
, os.listdir (u '.')
restituisce un elenco di oggetti unicode
). Entrambi hanno i metodi encode
e decode
.
Python 3 sostanzialmente ribattezzato unicode
in str
. Python 3 equivalente a str
sarebbe il tipo byte
. byte
ha un decode
e str
un metodo encode
. Poiché gli oggetti Python 3.3 str
usano internamente uno di diverse codifiche per risparmiare memoria. Per un programmatore Python sembra ancora una sequenza unicode astratta.
Supporta Python:
- codifica / decodifica
- normalizzazione
- semplice conversione e divisione in spazi bianchi
- cercando i personaggi con il loro nome
Python non supporta / ha un supporto limitato per:
- regole di confronto (limitate)
- conversioni di casi speciali in cui non esiste un mapping 1: 1 tra caratteri minuscoli e maiuscoli
- espressioni regolari ( ha funzionato su )
- segmentazione del testo
- gestione del testo bidirezionale
Vedi anche: La verità su Unicode in Python
JavaScript
Sembra che prima di JS 1.3 non esistesse il supporto per Unicode. A partire da 1.5, UTF-8, UTF-16 e UCS-2 sono tutti supportati. È possibile utilizzare le sequenze di escape Unicode in stringhe, regex e identificatori. Source
.NET (C #, VB.NET, ...)
I negozi .NET stringhe internamente come una sequenza di System.Char
. Un System.Char
rappresenta un UTF-16 unità di codice .
Dalla documentazione MSDN su System.Char
:
.NET Framework utilizza il carattere struttura per rappresentare un Unicode personaggio. Lo standard Unicode identifica ogni carattere Unicode con un numero scalare univoco a 21 bit chiamato a punto di codice e definisce l'UTF-16 modulo di codifica che specifica come a il punto di codice è codificato in una sequenza di uno o più valori a 16 bit. Ogni Il valore a 16 bit varia da esadecimale Da 0x0000 a 0xFFFF ed è memorizzato in una struttura Char .
Risorse aggiuntive:
- Stringhe in .NET e C # (di Jon Skeet).
Tcl
Le stringhe Tcl sono state sequenze di caratteri Unicode da Tcl 8.1 (1999 ). Internamente, si trasformano dinamicamente tra UTF-8 (rigorosamente lo stesso UTF-8 modificato come Java a causa della gestione di U + 00000
) e UCS-2 (in endianness host e BOM, ovviamente). Tutte le stringhe esterne (con una sola eccezione), comprese quelle utilizzate per comunicare con il sistema operativo, sono internamente Unicode prima di essere trasformate in qualsiasi codifica richiesta per l'host (o configurata manualmente su un canale di comunicazione). L'eccezione riguarda i casi in cui i dati vengono copiati tra due canali di comunicazione con una codifica comune (e alcune altre restrizioni non germane qui) in cui viene utilizzato un trasferimento binario senza copia diretta.
I personaggi al di fuori del BMP non sono attualmente gestiti né internamente né esternamente. Questo è un problema noto.
Schema R6RS
Richiede l'implementazione di Unicode 5.1. Tutte le stringhe sono in "formato unicode".
Rust
Le stringhe di Rust ( std :: String
e & amp; str
) sono sempre valide UTF-8 e non usano terminatori null e, di conseguenza, non possono essere indicizzati come un array, come se fossero in C / C ++, ecc. Possono essere suddivisi in qualche modo come Vai usando .get
da 1.20, con l'avvertenza che fallirà se provi a tagliare la metà di un punto di codice.
Rust ha anche OsStr
/ OsString
per interagire con il sistema operativo host. È un array di byte su Unix (contenente qualsiasi sequenza di byte). Su Windows è WTF-8 (un super-set di UTF-8 che gestisce le stringhe Unicode formate in modo errato che sono consentite in Windows e Javascript), & amp; str
e String
può essere liberamente convertito in OsStr
o OsString
, ma è necessario che i controlli vengano convertiti in altro modo. In caso di errore su Unicode non valido o sostituzione con il carattere di sostituzione Unicode. (C'è anche Path
/ PathBuf
, che sono solo dei wrapper attorno a OsStr
/ OsString
).
Esistono anche i tipi CStr
e CString
, che rappresentano stringhe C con terminazione Null, come OsStr
su Unix, che possono contenere byte arbitrari.
Rust non supporta direttamente UTF-16. Ma può convertire OsStr
in UCS-2 su Windows.
Objective-C
Nessuno incorporato, a parte qualsiasi cosa sia disponibile come parte della libreria di stringhe C.
Tuttavia, una volta aggiunti i framework & # 8230;
Foundation (Cocoa and Cocoa Touch) e Core Foundation
NSString e CFString implementano ciascuno una classe di stringa completamente basata su Unicode (in realtà diverse classi, come dettaglio di implementazione). I due sono & # 8220; numero verde gratuito & # 8221; in modo che l'API per uno possa essere utilizzata con istanze dell'altro e viceversa.
Per i dati che non rappresentano necessariamente il testo, ci sono NSData e CFData. NSString fornisce metodi e CFString fornisce funzioni per codificare il testo in dati e decodificare il testo dai dati. Core Foundation supporta più di cento codifiche diverse, incluse tutte le forme di UTF. Le codifiche sono divise in due gruppi: codifiche integrate , supportate ovunque, e codifiche esterne , che sono almeno supportate su Mac OS X.
NSString fornisce metodi per normalizzare i moduli D, KD, C o KC. Ognuno restituisce una nuova stringa.
Sia NSString che CFString offrono un'ampia varietà di opzioni di confronto / confronto. Ecco Flag delle opzioni di confronto della Fondazione e flag delle opzioni di confronto della Core Foundation . Non sono tutti sinonimi; ad esempio, Core Foundation rende predefinito il confronto letterale (basato su code-point rigoroso), mentre Foundation rende il confronto non letterale (consentendo a personaggi con accenti di confrontare uguali) l'impostazione predefinita.
Nota che Core Foundation non richiede Objective-C; infatti, è stato creato praticamente per fornire la maggior parte delle funzionalità dei programmatori da Foundation a Carbon, che hanno usato direttamente C o C ++. Tuttavia, sospetto che il suo uso più moderno sia nei programmi Cocoa o Cocoa Touch, che sono tutti scritti in Objective-C o Objective-C ++.
C / C ++
C
C prima di C99 non ha un supporto Unicode integrato. Utilizza stringhe di caratteri con terminazione zero ( char *
o char []
). Un char
è specificato da un byte (8 bit).
C99 specifica le funzioni wcs
in aggiunta alle vecchie funzioni str
(ad es. strlen
- > wcslen
). Queste funzioni accettano wchar_t *
anziché char *
. wchar_t
sta per tipo di carattere largo. La dimensione di wchar_t
è specifica del compilatore e può essere piccola fino a 8 bit. Sebbene diversi compilatori utilizzino effettivamente dimensioni diverse, di solito è a 16 bit (UTF-16) o 32 bit (UTF-32).
La maggior parte delle funzioni della libreria C sono trasparenti a UTF-8. Per esempio. se il tuo sistema operativo supporta UTF-8 (e UTF-8 è configurato come set di caratteri del tuo sistema), quindi la creazione di un file utilizzando fopen
passando una stringa codificata UTF-8 creerà un file con nome appropriato.
C ++
La situazione in C ++ è molto simile ( std :: string
- > std :: wstring
), ma ci sono almeno degli sforzi per ottenere una sorta di < a href = "http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3572.html" rel = "nofollow noreferrer"> supporto unicode nella libreria standard .
D
D supporta UTF-8, UTF-16 e UTF-32 (rispettivamente char, wchar e dchar). La tabella con tutti i tipi è disponibile qui .
PHP
Esiste già un intero thread su questo su SO!
Rubino
L'unica cosa che posso trovare per Ruby è piuttosto vecchia e non essendo molto rubista, non sono sicuro di quanto sia accurata.
Per la cronaca, Ruby supporta utf8, ma non multibyte. Internamente, di solito si presume che le stringhe siano vettori di byte, sebbene ci siano librerie e trucchi che di solito è possibile utilizzare per far funzionare le cose.
Trovato che qui .
Ruby 1.9
Ruby 1.9 allega le codifiche alle stringhe. Le stringhe binarie usano la codifica "ASCII-8BIT". Mentre la codifica predefinita è di solito UTF-8 su qualsiasi sistema moderno, non si può presumere che tutte le funzioni di libreria di terze parti restituiscano sempre stringhe in questa codifica. Potrebbe restituire qualsiasi altra codifica (ad esempio alcuni parser yaml lo fanno in alcune situazioni). Se concateni due stringhe di codifica diversa, potresti ottenere un Encoding :: CompatibilityError
.
Lua
Lua 5.3 ha una libreria utf8
integrata, che gestisce la codifica UTF-8. Ti permette di convertire una serie di punti di codice nella sequenza di byte corrispondente e viceversa, ottenere la lunghezza (il numero di punti di codice in una stringa), scorrere i punti di codice in una stringa, ottenere la posizione in byte del n th codepoint. Fornisce inoltre un modello, che verrà utilizzato dalle funzioni di corrispondenza dei modelli nella libreria string
, che corrisponderà a una sequenza di byte UTF-8.
Lua 5.3 ha sequenze di escape del punto di codice Unicode che possono essere utilizzate in valori letterali stringa (ad esempio, " \ u {61} "
per " a "
). Si traducono in sequenze di byte UTF-8.
Il codice sorgente Lua può essere codificato in UTF-8 o qualsiasi codifica in cui i caratteri ASCII occupano un byte. UTF-16 e UTF-32 non sono compresi dall'interprete Lua vaniglia. Ma le stringhe possono contenere qualsiasi codifica o dati binari arbitrari.