Support Unicode dans différents langages de programmation
j'aimerais avoir un endroit canonique pour mettre en commun des informations sur le support Unicode dans différentes langues. Fait-elle partie de la langue de base? Il est fourni dans les bibliothèques? Elle n'est pas disponible? Est-il une ressource populaire de ressources pour l'Unicode des informations dans une langue? Une langue par réponse s'il vous plaît. Aussi, si vous pourriez faire de la langue un titre qui serait plus facile à trouver.
20 réponses
Perl
Perl a intégré le support Unicode, la plupart du temps. En quelque sorte. De perldoc:
- perlunitut - Tutorial sur L'utilisation D'Unicode en Perl. Enseigne largement en termes absolus sur ce que vous devriez et ne devriez pas faire aussi loin Qu'Unicode. Couvre les notions fondamentales.
- perlunifaq - Foire aux questions sur Unicode en Perl.
- perluniintro - Introduction à Unicode en Perl. Moins de "preachy" que perlunitut .
- perlunicode - pour quand vous devez absolument savoir tout ce qu'il y a à savoir sur Unicode et Perl.
Python 3k
Python 3K (ou 3.0 ou 3000) a une nouvelle approche pour le traitement de texte (unicode) et des données:
texte Vs. Données Au Lieu D'Unicode Vs. 8-bit . Voir aussi Unicode HOWTO .
Java
comme pour .NET, Java utilise UTF-16 en interne: java.lang.Chaîne
a
String
représente une chaîne de caractères au format UTF-16 dans laquelle caractères supplémentaires sont représentés par paires de substituts (voir la section représentations de caractères Unicodes dans la classeCharacter
pour plus d'information). Index les valeurs se réfèrent aux unités de codechar
, donc un caractère supplémentaire utilise deux positions dans unString
.
HQ9+
la commande Q A Le support Unicode complet dans la plupart des implémentations.
Delphi
Delphi 2009 prend entièrement en charge Unicode. Ils ont changé l'implémentation de string
par défaut en un encodage Unicode 16 bits, et la plupart des bibliothèques, y compris les bibliothèques tierces, prennent en charge Unicode. Voir Delphi et Unicode de Marco Cantù .
avant Delphi 2009, le support pour Unicode était limité, mais il y avait WideChar
et WideString
pour stocker la chaîne codée 16 bits. Voir Unicode in Delphi pour plus d'informations.
notez que vous pouvez toujours développer une application bilingue CJKV sans utiliser Unicode. Par exemple, Shift JIS chaîne encodée pour le japonais peut être stockée en utilisant Uni AnsiString
.
Go
Google Go langage de programmation prend en charge Unicode et fonctionne avec UTF-8.
.NET (C#, VB.NET ...)
.NET magasins chaînes à l'interne comme une séquence de System.Char
des objets. Un System.Char
représente un UTF-16 Unité de code .
de la documentation MSDN sur System.Char
:
le .net Framework utilise le Char structure pour représenter une Unicode caractère. Le Standard Unicode identifie chaque caractère Unicode avec un numéro scalaire unique de 21 bits appelé a point de code, et définit L'UTF-16 forme d'encodage qui spécifie comment un le point de code est codé dans une séquence d'une ou de plusieurs valeurs de 16 bits. Chacun Valeur de 16 bits varie de hexadécimale 0x0000 à 0xFFFF et est stocké dans un Char de la structure.
ressources supplémentaires:
- les Chaînes .NET et C# (par Jon Skeet).
Tcl
Les chaînes Tcl sont des séquences de caractères Unicode depuis Tcl 8.1 (1999). En interne, ils sont morphés dynamiquement entre UTF-8 (strictement le même UTF-8 modifié que Java en raison de la manipulation de U+00000
caractères) et UCS-2 (dans l'endianness hôte et BOM, bien sûr). Toutes les chaînes externes (à une exception près), y compris celles utilisées pour communiquer avec L'OS, sont en Unicode interne avant d'être transformé en n'importe quel encodage requis pour l'hôte (ou configuré manuellement sur un canal de communication). L'exception est pour où les données est copié entre deux canaux de communication avec un encodage commun (et quelques autres restrictions non pertinentes ici) où un transfert binaire direct sans copie est utilisé.
en dehors du BMP ne sont actuellement traités ni à l'interne ni à l'externe. C'est un problème connu.
régime R6RS
nécessite la mise en œuvre D'Unicode 5.1. Toutes les chaînes sont au format unicode.
C / C++
C
C avant C99 n'a pas de support unicode intégré. Il utilise des tableaux à zéro caractère ( char*
ou char[]
) comme chaînes de caractères. Un char
est spécifié par un octet (8 bits).
C99 spécifie wcs
- fonctions dans les ajouts à l'ancienne str
- fonctions (p.ex. strlen
-> wcslen
). Ces fonctions prennent wchar_t*
au lieu de char*
. wchar_t
signifie "large caractère". La taille de wchar_t
est spécifique au compilateur et peut être aussi petite que 8 bits. Alors que les différents compilateurs utilisent en effet des tailles différentes, il s'agit généralement de 16 bits (UTF-16) ou 32 bits (UTF-32).
la plupart des fonctions de la bibliothèque C sont transparentes à UTF-8. Par exemple: si votre système d'exploitation supporte UTF-8 (et que UTF-8 est configuré comme le charset de votre système), alors la création d'un fichier en utilisant fopen
passant une chaîne encodée UTF-8 créera un fichier correctement nommé.
C++
la situation en c++ est très similaire ( std::string
-> std::wstring
), mais il ya au moins des efforts pour obtenir une sorte de support unicode dans la bibliothèque standard .
Python
Python 2 a les classes str
et unicode
. str
objets de stocker des octets, unicode
objets magasin UTF-16 caractères. La plupart des fonctions de la bibliothèque prennent en charge les deux (par exemple os.listdir('.')
renvoie une liste de str
, os.listdir(u'.')
renvoie une liste d'objets unicode
). Les deux méthodes sont encode
et decode
.
Python 3 renommé unicode
en str
. L'équivalent de Python 3 à str
serait le type bytes
. bytes
possède une méthode decode
et str
une méthode encode
. depuis Python 3.3 str
les objets utilisent en interne un de plusieurs encodages afin de sauver de la mémoire. Pour un programmeur Python, cela ressemble toujours à une séquence d'unicode abstraite.
supports Python:
- codage / décodage
- normalisation
- simple conversion de la casse et des fentes sur les espaces
- recherche de caractères par leur nom
Python ne supporte pas / a un support limité pour:
- classement (limitée)
- conversions de cas particuliers dans lesquelles il n'y a pas de correspondance 1:1 entre les caractères minuscules et les caractères majuscules
- expressions régulières ( il a travaillé sur ) "1519300920 de texte" segmentation
- traitement de texte bidirectionnel
Voir aussi: la vérité sur Unicode en Python
Objectif-C
aucun intégré, mis à part ce qui se trouve être disponible dans la bibliothèque C string.
cependant, une fois que vous ajoutez des cadres...
de la Fondation (Cocoa et Cocoa Touch) et le Noyau de la Fondation
NSString et CFString implémentent chacun une classe de chaîne entièrement basée sur Unicode (en fait plusieurs classes, comme détail d'implémentation). Les deux sont "sans frais-pontés" de sorte que l'API pour peut être utilisé avec les instances de l'autre, et vice versa.
pour les données qui ne représentent pas nécessairement du texte, il y a NSData et CFData. NSString fournit des méthodes et CFString fournit des fonctions pour encoder le texte dans les données et de décoder le texte à partir des données. La fondation de base soutient plus d'une centaine d'encodages différents, y compris toutes les formes de L'UTFs. Les encodages sont divisés en deux groupes: encodages intégrés , qui sont supportés partout, et codages externes , qui sont au moins pris en charge sur Mac OS X.
NSString fournit des méthodes pour la normalisation de formes D, KD, C, ou KC. Chacune renvoie une nouvelle chaîne.
NSString et CFString offrent toutes deux une grande variété d'options de comparaison/collation. Voici comparaison de la Fondation-Options et comparaison de la fondation de base-Options . Ils ne sont pas tous synonymes; par exemple, Core Foundation fait la comparaison littérale (strict code-point-based) par défaut, tandis que Foundation fait la comparaison non littérale (permettant aux caractères avec des accents de comparer égal) par défaut.
notez que Core Foundation ne nécessite pas D'Objectif-C; en effet, il a été créé pour fournir la plupart des fonctionnalités de Foundation aux programmeurs Carbon, qui ont utilisé C ou C++. Cependant, je soupçonne que l'usage le plus moderne de la TI est dans le cacao ou le cacao Les programmes tactiles, qui sont tous écrits en Objectif-C ou objectif-c++.
D
d supporte UTF-8, UTF-16, et UTF-32 (char, wchar, et dchar, respectivement). Le tableau avec tous les types peut être trouvé ici .
Ruby
la seule chose que je peux trouver pour Ruby est assez vieux et n'étant pas très un rubiste, Je ne suis pas sûr à quel point il est précis.
Pour rappel, Ruby supporte utf8, mais pas multibyte. En interne, il suppose habituellement que les chaînes sont des vecteurs bytes, bien qu'il y ait des bibliothèques et des trucs que vous pouvez habituellement utiliser pour faire fonctionner les choses.
a trouvé que ici .
Ruby 1.9
Ruby 1.9 attache des codages aux cordes. Les chaînes binaires utilisent l'encodage "ASCII-8BIT". Alors que L'encodage par défaut est habituellement UTF-8 sur n'importe quel système moderne, vous ne pouvez pas supposer que toutes les fonctions de bibliothèque de tiers renvoie toujours des chaînes dans cet encodage. Il peut renvoyer n'importe quel autre encodage (par exemple certains analyseurs yaml font cela dans certaines situations). Si vous concaténez deux chaînes d'encodage différent vous pourrait obtenir un Encoding::CompatibilityError
.
Rouille
rust's strings ( std::String
et &str
) sont toujours valides UTF-8, et n'utilisent pas de terminateurs nuls, et ne peuvent donc pas être indexés comme un tableau, comme ils peuvent l'être en C/C++, etc. Ils peuvent être tranchés un peu comme Go en utilisant .get
depuis 1.20, avec la mise en garde qu'il échouera si vous essayez de trancher le milieu d'un point de code.
Rust a aussi OsStr
/ OsString
pour interagir avec L'OS hôte. C'est d'octets tableau sur Unix (contenant n'importe quelle séquence d'octets). Sur windows c'est WTF-8 (un super-ensemble de UTF-8 qui gère les chaînes Unicode mal formées qui sont permises dans Windows et Javascript), &str
et String
peuvent être librement converties en OsStr
ou OsString
, mais nécessitent des vérifications pour couvrir l'autre manière. Soit en échouant sur unicode invalide, ou en remplaçant par le char de remplacement Unicode. (Il y a aussi Path
/ PathBuf
, qui sont juste enveloppants autour OsStr
/ OsString
).
il y a aussi les types CStr
et CString
, qui représentent des chaînes C à terminaison nulle, comme OsStr
sur Unix ils peuvent contenir des octets arbitraires.
ne supporte pas directement L'UTF-16. Mais peut convertir OsStr
en UCS-2 sur windows.
Lua
Lua 5.3 a une bibliothèque intégrée utf8
, qui gère L'encodage UTF-8. Il vous permet de convertir une série de codépoints à la séquence octet correspondante et l'inverse, obtenir la longueur (le nombre de codépoints dans une chaîne), itérer au-dessus des codépoints dans une chaîne, obtenir la position octet du n TH codé. Il fournit également un modèle, à utiliser par les fonctions d'appariement de modèle dans le string
bibliothèque, qui correspondra à une séquence D'octets UTF-8.
Lua 5.3 a des séquences d'échappement Unicode point qui peuvent être utilisées dans la littérature chaîne (par exemple, "\u{61}"
pour "a"
). Ils se traduisent par des séquences de octets UTF-8.
Lua code source peut être encodé en UTF-8 ou un codage en ASCII des caractères de prendre un octet. UTF-16 et UTF-32 ne sont pas compris par l'interprète Lua vanilla. Mais les chaînes peuvent contenir n'importe quel encodage, ou arbitraire des données binaires.