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.

27
demandé sur baudtack 2009-06-24 09:49:30

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.
10
répondu Chris Lutz 2009-06-28 18:40:08

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 .

8
répondu Shirkrin 2011-02-24 17:05:05

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 classe Character pour plus d'information). Index les valeurs se réfèrent aux unités de code char , donc un caractère supplémentaire utilise deux positions dans un String .

7
répondu Joey 2009-06-24 06:08:16

HQ9+

la commande Q A Le support Unicode complet dans la plupart des implémentations.

7
répondu user142019 2011-02-24 17:11:41

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 .

4
répondu Eugene Yokota 2009-06-28 18:56:26

Go

Google Go langage de programmation prend en charge Unicode et fonctionne avec UTF-8.

4
répondu Rohit 2011-02-09 04:14:56

JavaScript

ressemble à avant JS 1.3 il n'y avait pas de support pour Unicode. À partir de 1.5, UTF-8, UTF-16 et UCS-2 sont tous pris en charge. Vous pouvez utiliser les séquences d'échappement Unicode dans les chaînes, regexs et identifiants. Source

3
répondu baudtack 2009-07-01 05:20:28

.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:

3
répondu Fredrik Mörk 2010-08-23 08:18:43

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é.

Les caractères

en dehors du BMP ne sont actuellement traités ni à l'interne ni à l'externe. C'est un problème connu.

3
répondu Donal Fellows 2010-08-23 08:53:53

régime R6RS

nécessite la mise en œuvre D'Unicode 5.1. Toutes les chaînes sont au format unicode.

3
répondu leppie 2010-08-23 08:58:19

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 .

3
répondu panzi 2013-09-20 20:37:18

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

3
répondu panzi 2013-09-20 21:10:27

Common Lisp (SBCL and CLisp)

selon ce , SBCL et CLisp support Unicode.

2
répondu baudtack 2009-06-24 22:39:51

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++.

2
répondu Peter Hosey 2010-08-23 08:40:15

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 .

2
répondu Benjamin Middaugh 2016-02-16 18:28:46

PHP

il y a déjà un fil entier sur ce SO!

1
répondu baudtack 2017-05-23 12:00:37

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 .

1
répondu baudtack 2013-09-20 20:03:11

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.

La rouille

ne supporte pas directement L'UTF-16. Mais peut convertir OsStr en UCS-2 sur windows.

1
répondu Tristram Healy 2018-03-07 00:59:07

Arc

Arc n'a pas de support unicode. et .

0
répondu baudtack 2009-06-28 04:12:32

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.

0
répondu cyclaminist 2018-06-16 04:24:45