さまざまなプログラミング言語でのUnicodeサポート
-
10-07-2019 - |
質問
さまざまな言語のUnicodeサポートに関する情報をプールするための標準的な場所が欲しいです。それはコア言語の一部ですか?ライブラリで提供されていますか?まったく利用できませんか?言語のUnicode情報に関する一般的なリソースはありますか?回答ごとに1つの言語を入力してください。また、言語を見出しにすると、見つけやすくなります。
正しい解決策はありません
他のヒント
Perl
Perlには、ほとんどの場合、Unicodeサポートが組み込まれています。並べ替え。 perldocから:
- perlunitut -PerlでUnicodeを使用するためのチュートリアル。 Unicodeの範囲内ですべきこととすべきでないことについて、絶対的な用語で大まかに教えます。基本をカバーしています。
- perlunifaq -PerlのUnicodeに関するよくある質問。
- perluniintro -PerlでのUnicodeの紹介。より少ない「説教」 perlunitut より。
- perlunicode -ユニコードとPerlについて知っておくべきすべてのことを絶対に知る必要がある場合。
Python 3k
Python 3k(または3.0または3000)には、テキスト(ユニコード)とデータを処理するための新しいアプローチがあります:
テキスト対Unicode Vの代わりのデータ。 8ビット。 Unicode HOWTO も参照してください。
Java
.NETと同様に、Javaは内部でUTF-16を使用します: java.lang.String
A
String
はUTF-16形式の文字列を表し、補助文字はサロゲートペアで表されます(セクションのUnicode文字表現
詳細については、Character クラスをご覧ください)。インデックス値はchar
コード単位を参照するため、補助文字はString
の2つの位置を使用します。
HQ9 +
Qコマンドは、ほとんどの実装でUnicodeを完全にサポートしています。
Delphi
Delphi 2009はUnicodeを完全にサポートしています。彼らは string
の実装をデフォルトの16ビットUnicodeエンコーディングに変更し、サードパーティのものを含むほとんどのライブラリはUnicodeをサポートしています。 Marco Cantùの DelphiおよびUnicode を参照してください。
Delphi 2009より前では、Unicodeのサポートは制限されていましたが、16ビットのエンコードされた文字列を保存するための WideChar
および WideString
がありました。詳細については、 DelphiのUnicode を参照してください。
注:Unicodeを使用しなくても、バイリンガルCJKVアプリケーションを開発できます。たとえば、 Shift JIS エンコードされた日本語の文字列は、プレーンな AnsiStringを使用して保存できます。
。
移動
Googleの Goプログラミング言語はUnicodeをサポートし、UTF-8で動作します。
Python
Python 2には、クラス str
および unicode
があります。 str
オブジェクトはバイトを保存し、 unicode
オブジェクトはUTF-16文字を保存します。ほとんどのライブラリ関数は両方をサポートします(たとえば、 os.listdir( '。')
は str
、 os.listdir(u '。')
unicode
オブジェクトのリストを返します)。どちらにも encode
および decode
メソッドがあります。
Python 3は基本的に unicode
を str
に名前変更しました。 str
と同等のPython 3は、 bytes
型になります。 bytes
には decode
メソッドと str
encode
メソッドがあります。 Python 3.3以降 str
オブジェクトは内部的に1つを使用しますメモリを節約するために、いくつかのエンコーディングを使用します。 Pythonプログラマーにとっては、依然として抽象Unicodeシーケンスのように見えます。
Pythonのサポート:
- エンコード/デコード
- 正規化
- 単純な大文字小文字の変換と空白での分割
- キャラクターを名前で検索する
Pythonは以下をサポートしていない/サポートが制限されています
- 照合(制限付き)
- 大文字と小文字の間に1対1のマッピングがない特殊なケースの変換
- 正規表現(機能している)
- テキストセグメンテーション
- 双方向テキスト処理
JavaScript
JS 1.3以前はUnicodeがサポートされていなかったようです。 1.5以降、UTF-8、UTF-16、UCS-2がすべてサポートされます。文字列、正規表現、および識別子でUnicodeエスケープシーケンスを使用できます。 ソース
.NET(C#、VB.NET、...)
.NETは、文字列を内部的にシーケンスとして保存します System.Char
オブジェクト。 1つの System.Char
はUTF-16 コードユニットを表します。
System.Char
のMSDNドキュメントから:
.NET Frameworkは Char を使用します Unicodeを表す構造 キャラクター。 Unicode標準 各Unicode文字を識別する と呼ばれる一意の21ビットスカラー番号 コードポイント、およびUTF-16を定義 方法を指定するエンコード形式 コードポイントはシーケンスにエンコードされます 1つ以上の16ビット値。各 16ビット値の範囲は16進数から 0x0000〜0xFFFFに格納されます Char 構造。
追加のリソース:
- .NETおよびC#の文字列(Jon Skeetによる)。
Tcl
Tcl文字列は、 Tcl 8.1 (1999年以来、Unicode文字のシーケンスです。 )。内部的には、UTF-8の間で動的にモーフィングされます(厳密に同じ修正UTF-8 U + 00000
文字の処理によるJava およびUCS-2(もちろんホストエンディアンとBOMで)。 OSとの通信に使用されるものを含むすべての外部文字列(1つの例外を除く)は、ホストに必要なエンコードに変換される前に内部的にUnicodeです(または通信チャネルで手動で構成されます)。例外は、データが 2つの通信チャネル間でコピーされる場合です。直接的なコピーフリーのバイナリ転送が使用される一般的なエンコード(およびここでは密接な関係のない他のいくつかの制限)を使用します。
BMPの外側の文字は現在、内部でも外部でも処理されません。これは既知の問題です。
R6RSスキーム
Unicode 5.1の実装が必要です。すべての文字列は「ユニコード形式」です。
錆
Rustの文字列( std :: String
および& str
)は常に有効なUTF-8であり、nullターミネーターを使用しないため、結果としてC / C ++などのように配列としてインデックス付けされます。1.20以降は .get
を使用してGoのようにスライスできますが、中央をスライスしようとすると失敗しますコードポイント。
Rustには、ホストOSと対話するための OsStr
/ OsString
もあります。これは、Unix上のバイト配列です(バイトのシーケンスを含む)。 Windowsでは、WTF-8(WindowsおよびJavascriptで許可されている不適切に形成されたUnicode文字列を処理するUTF-8のスーパーセット)、& str
および String
OsStr
または OsString
に自由に変換できますが、逆の方法でチェックする必要があります。無効なユニコードで失敗するか、Unicode置換文字で置き換えることによって。 ( Path
/ PathBuf
もあります。これは、 OsStr
/ OsString
の単なるラッパーです)。
CStr
型と CString
型もあります。これらは、Unicodeの OsStr
のように、任意のバイトを含むことができるヌル終端C文字列を表します。
RustはUTF-16を直接サポートしていません。ただし、Windowsでは OsStr
をUCS-2に変換できます。
Objective-C
C文字列ライブラリの一部として利用できるものは別として、ビルトインなし。
ただし、フレームワークを追加したら…
Foundation(Cocoa and Cocoa Touch)およびCore Foundation
NSStringおよびCFStringは、それぞれ完全にUnicodeベースの文字列クラスを実装します(実際には、実装の詳細としていくつかのクラス)。この2つは、“フリーブリッジされています”そのため、一方のAPIを他方のAPIで使用でき、その逆も可能です。
必ずしもテキストを表すとは限らないデータには、NSDataとCFDataがあります。 NSStringはメソッドを提供し、CFStringはテキストをデータにエンコードし、データからテキストをデコードする関数を提供します。 Core Foundationは、すべての形式のUTFを含む100種類以上のエンコーディングをサポートしています。エンコーディングは2つのグループに分けられます:組み込みエンコーディング(どこでもサポートされています)、および外部エンコーディング。少なくともMac OS Xでサポートされています。
NSStringは、フォームD、KD、C、またはKCに正規化するためのメソッドを提供します。それぞれが新しい文字列を返します。
NSStringとCFStringはどちらも、さまざまな比較/照合オプションを提供します。 Foundationの比較オプションフラグおよび Core Foundationの比較オプションフラグ。それらはすべて同義語ではありません。たとえば、Core Foundationはリテラル(厳密なコードポイントベース)比較をデフォルトにしますが、Foundationは非リテラル比較(アクセント付き文字の比較を同等にする)をデフォルトにします。
Core FoundationはObjective-Cを必要としないことに注意してください。実際、Foundationのほとんどの機能をストレートCまたはC ++を使用したCarbonプログラマーに提供するために作成されました。ただし、最近のほとんどの使用方法は、CocoaまたはCocoa Touchプログラムであると思われます。これらはすべてObjective-CまたはObjective-C ++で記述されています。
C / C ++
C
C99より前の Cには、Unicodeサポートが組み込まれていません。文字列としてゼロで終了する文字配列( char *
または char []
)を使用します。 char
は、バイト(8ビット)で指定されます。
C99は、古い str
-関数に加えて、 wcs
-関数を指定します(例: strlen
-> wcslen
)。これらの関数は、 char *
ではなく wchar_t *
を取ります。 wchar_t
はワイド文字タイプを表します。 wchar_t
のサイズはコンパイラ固有であり、8ビットまで小さくすることができます。コンパイラごとにサイズが異なりますが、通常は16ビット(UTF-16)または32ビット(UTF-32)です。
ほとんどのCライブラリ関数はUTF-8に対して透過的です。例えば。オペレーティングシステムがUTF-8をサポートしている場合(およびシステムの文字セットとしてUTF-8が設定されている場合)、UTF-8エンコード文字列を渡す fopen
を使用してファイルを作成すると、適切な名前のファイルが作成されます。
C ++
C ++の状況は非常に似ています( std :: string
-> std :: wstring
)が、少なくとも何らかの< href = "http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3572.html" rel = "nofollow noreferrer">標準ライブラリでのUnicodeサポート。
D
Dは、UTF-8、UTF-16、およびUTF-32(それぞれ、char、wchar、およびdchar)をサポートします。すべてのタイプの表は、こちらにあります。
PHP
SOでこれにスレッド全体が既にあります!
ルビー
Rubyで見つけることができる唯一のものはかなり古く、あまりルビストではないので、どれほど正確かはわかりません。
レコードでは、Rubyはutf8をサポートしていますが、マルチバイトはサポートしていません。内部的には、通常は文字列がバイトベクトルであると想定していますが、通常は動作させるために使用できるライブラリとトリックがあります。
こちら 。
Ruby 1.9
Ruby 1.9は文字列にエンコーディングを付加します。バイナリ文字列は、エンコード「ASCII-8BIT」を使用します。通常、最新のシステムではデフォルトのエンコーディングはUTF-8ですが、すべてのサードパーティライブラリ関数がこのエンコーディングで常に文字列を返すとは限りません。他のエンコーディングを返す場合があります(たとえば、一部のyamlパーサーは状況によってそれを行います)。異なるエンコーディングの2つの文字列を連結すると、可能性があります Encoding :: CompatibilityError
が発生します。
Lua
Lua 5.3には、UTF-8エンコーディングを処理する組み込みの utf8
ライブラリがあります。これにより、一連のコードポイントを対応するバイトシーケンスに変換したり、その逆を行ったり、長さ(文字列内のコードポイントの数)を取得したり、文字列内のコードポイントを反復処理したり、のバイト位置を取得したりできますn 番目のコードポイント。また、 string
ライブラリのパターンマッチング関数で使用される、UTF-8バイトシーケンスに一致するパターンも提供します。
Lua 5.3には、文字列リテラルで使用できるUnicodeコードポイントエスケープシーケンスがあります(たとえば、&quot; a&quot;
の場合は&quot; \ u {61}&quot;
)。 UTF-8バイトシーケンスに変換されます。
Luaソースコードは、UTF-8またはASCII文字が1バイトを占める任意のエンコーディングでエンコードできます。 UTF-16およびUTF-32は、バニラLuaインタープリターによって理解されません。ただし、文字列には任意のエンコーディングまたは任意のバイナリデータを含めることができます。