Unicode-Unterstützung in verschiedenen Programmiersprachen
-
10-07-2019 - |
Frage
Ich mag einen kanonischen Ort, um Informationen über die Unicode-Unterstützung in verschiedenen Sprachen zu bündeln. Ist es ein Teil der Kernsprache? Ist es in Bibliotheken zur Verfügung gestellt? Ist es überhaupt nicht zur Verfügung? Gibt es eine Ressource beliebte Ressource für Unicode in einer Sprache? Eine Sprache pro Antwort bitte. Auch wenn Sie die Sprache eine Überschrift machen könnten, das würde es leichter zu finden.
Keine korrekte Lösung
Andere Tipps
Perl
Perl verfügt über eine integrierte in Unicode-Unterstützung, meistens. Art. Von Perldoc:
- perlunitut - Tutorial auf Unicode in Perl. lehrt Weitgehend in absoluten Zahlen über das, was Sie sollten und so weit wie Unicode nicht tun sollten. Abdeckungen Grundlagen.
- perlunifaq -. Häufig gestellte Fragen zu Unicode in Perl
- perluniintro - Einführung in Unicode in Perl. Weniger "moralisierend" als perlunitut .
- perlunicode - Denn wenn Sie unbedingt wissen müssen alles über Unicode und Perl wissen .
Python 3k
Python 3k (oder 3.0 oder 3000) hat neuen Ansatz für den Umgang mit Text (Unicode) und Daten:
Text Vs. Daten anstelle von Unicode Vs. 8-Bit-. Siehe auch Unicode HOWTO .
Java
Das gleiche wie mit .NET, Java verwendet UTF-16 intern: java.lang.String
A
String
stellt eine Zeichenfolge in dem UTF-16-Format, in dem ergänzenden Zeichen sind, dargestellt durch Ersatzpaare (siehe Abschnitt Unicode-Zeichendarstellungen in derCharacter
Klasse für weitere Informationen). Index-Werte beziehen sich Codeeinheiten aufchar
, so ein ergänzendes Zeichen verwendet zwei Positionen in einerString
.
HQ9 +
Der Q-Befehl hat die vollständige Unicode-Unterstützung in den meisten Implementierungen.
Delphi
Delphi 2009 voll unterstützt Unicode. Sie haben die Implementierung von string
geändert zu 16-Bit-Unicode-Codierung auf Standard und die meisten Bibliotheken einschließlich der Dritten diejenigen Unicode unterstützen. Siehe Marco Cantù Delphi und Unicode .
Vor Delphi 2009 wurde die Unterstützung für Unicode begrenzt, aber es gab WideChar
und WideString
die 16-Bit-codierte Zeichenfolge zu speichern. Siehe Unicode in Delphi für weitere Informationen.
Beachten Sie, können Sie immer noch zweisprachige CJKV Anwendung entwickeln, ohne Verwendung von Unicode. Zum Beispiel JIS Shift- Zeichenfolge codiert für japanische Ebene AnsiString
Verwendung gespeichert werden können.
Go
Google Programmiersprache Go unterstützt Unicode und arbeitet mit UTF-8.
Python
Python 2 die Klassen str
und unicode
. str
Objekte speichern Bytes, unicode
Objekte speichern UTF-16 Zeichen. Die meisten Bibliotheksfunktionen unterstützen beide (z os.listdir('.')
eine Liste von str
zurückgibt, os.listdir(u'.')
gibt eine Liste von unicode
Objekte). Beide haben encode
und decode
Methoden.
Python 3 im Grunde umbenannt unicode
str
. Der Python 3 entspricht str
wäre der Typ bytes
sein. bytes
hat eine decode
und str
eine encode
Methode. Da Python 3.3 str
Objekte intern eine von mehreren Codierungen verwenden, um zu sparen Erinnerung. Für einen Python-Programmierer sieht es immer noch wie eine abstrakte Unicode-Sequenz.
Python unterstützt:
- Kodierung / Dekodierung
- Normalisierung
- einfache Fall Umwandlung und Spaltung auf Leerzeichen
- Nachschlagen Zeichen durch ihren Namen
Python nicht unterstützt / begrenzte Unterstützung für hat:
- Sortierungs (haftungsbeschränkt)
- Sonderfall Conversions, bei denen es keine 1: 1-Zuordnung zwischen Groß- und Kleinschreibung Zeichen
- reguläre Ausdrücke ( es auf gearbeitet)
- Text Segmentierung
- bidirektionalen Text Handhabung
Siehe auch: Die Wahrheit über Unicode in Python
JavaScript
Sieht aus wie vor JS 1.3 gibt es keine Unterstützung für Unicode war. Ab 1,5, UTF-8, UTF-16 und UCS-2 werden unterstützt. Sie können Unicode-Escape-Sequenzen in Strings, regexs und Bezeichner verwenden. Quelle
.NET (C #, VB.NET, ...)
.NET speichert Strings intern als eine Folge von System.Char
Objekte. Ein System.Char
stellt eine UTF-16 Codeeinheit .
Aus der MSDN-Dokumentation auf System.Char
:
Das .NET Framework verwendet die Char Struktur stellen eine Unicode Charakter. Der Unicode-Standard identifiziert jedes Unicode-Zeichen mit eine einzigartige 21-Bit skalare Zahl genannt Codepunkt und definiert die UTF-16 Kodierungsform, die angibt, wie ein Codepunkt wird in eine Sequenz codiert von einem oder mehreren 16-Bit-Werte. Jeder 16-Bit-Wert im Bereich von hexadezimal 0x0000 bis 0xFFFF und gespeichert ist in Char Struktur.
Weitere Informationen:
- Strings in .NET und C # (von Jon Skeet).
Tcl
Tcl Strings haben Sequenzen von Unicode-Zeichen seit Tcl 8.1 (1999 ). Intern werden sie dynamisch zwischen UTF-8 (streng derselben Modifizierte morphed UTF-8 als Java aufgrund des Umgang mit U+00000
Zeichen) und UCS-2 (in Host-Endian und BOM, natürlich). Alle externen Ketten (mit einer Ausnahme), einschließlich denjenigen mit dem verwendeten Betriebssystem zu kommunizieren, sind intern Unicode, bevor sie in transformiert wird, was auch immer Codierung für den Host erforderlich ist (oder wird manuell über einen Kommunikationskanal konfiguriert). Die Ausnahme ist, wenn Daten zwischen zwei Kommunikationskanälen kopiert mit einer gemeinsamen Codierung (und einigen anderen Einschränkungen nicht hier Germane), wo eine direkte Kopie freie binäre Übertragung verwendet wird.
Charaktere außerhalb des BMP sind derzeit nicht entweder intern oder extern behandelt. Dies ist ein bekanntes Problem.
R6RS Schema
erfordert die Implementierung von Unicode 5.1. Alle Saiten sind in 'Unicode-Format'.
Rust
Rust Strings (std::String
und &str
) gelten immer UTF-8, und verwenden Sie keine Null Terminatoren, und als Ergebnis kann nicht als ein Array indiziert werden, wie sie in C / C sein kann ++ usw. können Sie sein in Scheiben geschnitten etwas wie Go .get
seit 1.20, mit dem Vorbehalt mit, dass es fehlschlagen, wenn Sie die Mitte eines Codepunktes versuchen schneiden.
Rust hat auch OsStr
/ OsString
für mit dem Host-Betriebssystem interagieren. Es ist Byte-Array auf Unix (jede Folge von Bytes enthält). Unter Windows ist es WTF-8 (Ein Super-Satz von UTF-8, die unförmig Unicode-Strings behandelt, die in Windows und Javascript erlaubt), &str
und String
frei zu OsStr
oder OsString
umgewandelt werden, sondern erfordern prüft die andere verdeckte Weg. Entweder indem sie nicht auf ungültige Unicode oder ersetzt mit dem Unicode-Ersatz char. (Es gibt auch Path
/ PathBuf
, das sind nur Wrapper um OsStr
/ OsString
).
Es gibt auch die CStr
und CString
Typen, die repräsentieren Null C-Strings beendet, wie OsStr
auf Unix sie beliebiges Bytes enthalten können.
Rust nicht direkt unterstützt UTF-16. Aber kann OsStr
zu UCS-2 auf Windows konvertieren.
Objective-C
Kein eingebaut, abgesehen von was auch immer geschieht, als Teil der C-String-Bibliothek zur Verfügung steht.
Wenn Sie jedoch hinzufügen Frameworks ...
Foundation (Cocoa und Cocoa Touch) und Core Foundation
NSString und CFString implementieren jeweils eine vollständig Unicode-basierte String-Klasse (eigentlich mehr Klassen, als Implementierungsdetail). Die beiden sind „gebührenfreie verbrückten“, so dass das API für eine mit Instanzen der anderen verwendet werden, und umgekehrt.
Für Daten, die nicht notwendigerweise Text darstellen wird, gibt es NSData und cfdata. NSString stellt Verfahren und CFString stellt Funktionen Text-Daten zu codieren und zu Textdaten dekodieren. Core Foundation unterstützt mehr als hundert verschiedene Kodierungen, einschließlich aller Formen der UTFs. Die Codierungen sind in zwei Gruppen unterteilt: Einbau-Codierungen , die überall unterstützt werden, und externen Kodierungen , die zumindest unterstützt werden auf Mac OS X.
NSString stellt Verfahren zum Normieren auf Formen D, KD, C oder KC. Jeder gibt einen neuen String.
Sowohl NSString und CFString bieten eine Vielzahl von Vergleichs- / Sortierungsoptionen. Hier sind Stiftung Vergleich-Option Flaggen und Core Foundation der Vergleich-Option Flags. Sie sind nicht alle gleichbedeutend; zum Beispiel macht Core Foundation wörtlichen (strenge Code-Punkt-basiert) Vergleich den Standard, während Foundation nicht-wörtlichen Vergleich macht (so dass Zeichen mit Akzenten gleich vergleichen), um die Standardeinstellung.
Beachten Sie, dass Core Foundation nicht Objective-C erfordert; in der Tat, es war ziemlich viel erstellt die meisten Funktionen der Stiftung Carbon-Programmierer zur Verfügung zu stellen, die gerade in C oder C ++ verwendet. Aber ich vermute, die meisten modernen Gebrauch davon in Cocoa oder Cocoa Touch-Programmen ist, die alle in geschrieben werden, Objective-C oder Objective-C ++.
C / C ++
C
C vor C99 hat keine in Unicode-Unterstützung gebaut. Es verwendet Null beendet Zeichen-Arrays (char*
oder char[]
) als Strings. A char
wird angegeben durch ein Byte (8 Bits).
C99 gibt wcs
-Funktionen in den Zugängen zu den alten str
-Funktionen (z strlen
-> wcslen
). Diese Funktionen nehmen wchar_t*
statt char*
. wchar_t
steht für Wide-Zeichen-Typen. Die Größe des wchar_t
ist Compiler-spezifisch und kann so klein wie 8 Bits sein. Während verschiedene Compiler in der Tat verschiedene Größen verwenden, ist es in der Regel 16-Bit (UTF-16) oder 32-Bit (UTF-32).
Die meisten C-Bibliotheksfunktionen sind transparent für UTF-8. Z.B. wenn Ihr Betriebssystem unterstützt UTF-8 (und UTF-8 als Ihre Systeme charset konfiguriert), dann das Erstellen einer Datei mit fopen
Gabe eines UTF-8 kodierten String erstellen richtig benannte Datei.
C ++
Die Situation in C ++ ist sehr ähnlich (std::string
-> std::wstring
), aber es gibt zumindest Bemühungen, eine Art Unicode-Unterstützung in der Standardbibliothek .
D
D unterstützt UTF-8, UTF-16 und UTF-32 (char, wchar und Dchar, jeweils). Die Tabelle mit allen Typen können hier .
PHP
Es gibt bereits ein ganzen Thread dazu auf SO!
Rubin
Das einzige Material, das ich für Ruby finden kann ziemlich alt ist und nicht viel von einem rubist zu sein, ich bin mir nicht sicher, wie genau es ist.
Für die Aufzeichnung funktioniert Ruby-Unterstützung UTF-8, aber nicht multibyte. Intern wird in der Regel davon ausgegangen, Strings Byte-Vektoren sind, obwohl es Bibliotheken und Tricks sind, können Sie in der Regel Dinge Arbeit machen verwenden.
Gefunden dass hier .
Ruby 1.9
Ruby 1.9 legt Codierungen auf Strings. Binärketten verwenden, um die Codierung „ASCII-8BIT“. Während die Standard-Kodierung in der Regel UTF-8 auf jedem modernen System ist, kann man nicht davon ausgehen, dass alle Drittanbieter-Bibliothek Funktionen immer Strings in dieser Codierung zurückgibt. Es könnte jede andere Codierung zurückkehren (z.B. einige yaml Parser tun, dass in einigen Situationen). Wenn Sie zwei Zeichenfolgen unterschiedlicher Codierung verketten Sie Macht ein Encoding::CompatibilityError
erhalten.
Lua
Lua 5.3 verfügt über eine integrierte in utf8
Bibliothek, die die UTF-8-Codierung behandelt. Es ermöglicht Ihnen, eine Reihe von Codepoints in die entsprechende Byte-Reihenfolge und umgekehrt zu konvertieren, erhalten die Länge (die Anzahl der Codepunkte in einem String), durchlaufen die Codepunkte in einem String, erhalten die Byte-Position des n th Codepunkt. Es bietet auch ein Muster, die durch die Mustererkennungsfunktionen im string
Bibliothek verwendet werden, die eine UTF-8-Byte-Sequenz übereinstimmen.
Lua 5.3 hat Unicode-Codepunkt Escape-Sequenzen, die (zum Beispiel "\u{61}"
für "a"
) in Stringliterale verwendet werden können. Sie übersetzen in UTF-8-Byte-Sequenzen.
Code Lua Quelle kann in UTF-8-Codierung codiert, oder jede, in dem ASCII-Zeichen ein Byte einnehmen. UTF-16 und UTF-32 werden nicht von dem Vanille-Lua-Interpreter verstanden. Aber Strings kann eine beliebige Codierung enthält oder beliebige binäre Daten.