27

さまざまな言語でのUnicodeサポートに関する情報をプールするための標準的な場所が欲しいのですが。それはコア言語の一部ですか?図書館で提供されていますか?全然利用できませんか。ある言語でUnicode情報用のリソースの人気のあるリソースはありますか?一つの答えにつき一つの言語をお願いします。また、その言語を見出しにして、見つけやすくすることもできます。


  • 回答が実際に競合しない場合、投票はどのように解釈されるべきですか(言語ごとに1つの回答しかないため)。 「回答の有用性」、通常通り、または「その言語でのUnicodeサポートの全体的な品質」 :) - Jonik
  • よくわかりません。有用な情報を提供してくれたと思ったときは、投票していました。 - baudtack
  • 私はそれをCWにしました。なぜなら私は人々に答えを改善し拡大させたいのです。私が願っているのは、私が言語XでUnicodeサポートを調べたいときに、ここに来て有用な情報を見つけることができるということです。 - baudtack
  • CWは間違いなく正しいことです。多くの「正しい」答えがあります。一つの話題について何か言いたいことがある言語ごとに一つです。 (答えを投票するための適切な基準が何であるか確信があるわけではありません)。 - Donal Fellows

20 답변


11

Perl

Perlは主に組み込みのUnicodeサポートを持っています。並べ替えます。 perldocから:

  • perlunitut - PerlでUnicodeを使用するためのチュートリアル。 Unicodeに関して行うべきこと、すべきではないことについて、絶対的な意味で広く教えています。基本をカバーしています。
  • perlunifaq - PerlでのUnicodeに関するよくある質問。
  • perluniintro - PerlでのUnicodeの紹介「説教」よりも少ないperlunitut
  • perlunicode - UnicodeとPerlについて知っておくべきことがすべてわかっている必要があるとき。


  • いい答えだ!これはまさに私が得たいと思っていた種類のもの。 - baudtack
  • その情報の大部分を、のUnicodeの章にまとめました。効果的なPerlプログラミング。広げられたドキュメントを理解するのはそれほど面白くありませんでした。 - brian d foy

8

Python 3k

Python 3k(または3.0または3000)には、テキスト(Unicode)とデータを処理するための新しいアプローチがあります。

テキスト対Unicodeの代わりにデータ対。 8ビット。また見なさいUnicode HOWTO


7

Java

.NETと同様に、Javaは内部でUTF-16を使用します。java.lang.String

AStringUTF-16形式の文字列を表します。補助文字で表される代理ペア(セクションを見てくださいUnicode文字表現の中にCharacter詳細についてはクラス)。インデックス値charつまり、補助文字はコード単位内の2つの位置を使用します。String


7

HQ9 +

Qコマンドは、ほとんどの実装で完全なUnicodeをサポートしています。


4

デルファイ

Delphi 2009はUnicodeを完全にサポートしています。彼らはの実装を変更しましたstringデフォルトでは16ビットUnicodeエンコーディングが使用され、サードパーティのものを含むほとんどのライブラリはUnicodeをサポートしています。 MarcoCantùのを参照してください。DelphiとUnicode

Delphi 2009以前は、Unicodeのサポートは限られていましたが、WideCharそしてWideString16ビットエンコード文字列を格納します。見るDelphiのUnicode詳しくは

Unicodeを使用せずに、バイリンガルCJKVアプリケーションを開発することもできます。例えば、シフトJIS日本語のエンコードされた文字列はplainを使って格納することができますAnsiString


4

行く

グーグルプログラミング言語に行くUnicodeをサポートし、UTF-8で動作します。


3

JavaScript

JS 1.3より前は、Unicodeはサポートされていませんでした。 1.5では、UTF-8、UTF-16、UCS-2がすべてサポートされています。文字列、正規表現、および識別子にUnicodeエスケープシーケンスを使用できます。ソース


  • 私の知る限りでは、ほとんどのブラウザ実装は依然としてUCS-2の暗黒時代に立ち往生しているようです。 - cikkle

3

.NET(C#、VB.NET、...)

.NETストアひものシーケンスとして内部的にSystem.Charオブジェクト1System.CharUTF-16を表しますコード単位

上のMSDNのドキュメントからSystem.Char

.NET FrameworkはチャーUnicodeを表す構造   キャラクター。 Unicode規格   各Unicode文字を次のように識別します。   aと呼ばれる一意の21ビットスカラー数   コードポイント、およびUTF-16を定義   方法を指定する符号化形式   コードポイントはシーケンスにエンコードされます   1つ以上の16ビット値各   16ビット値は16進数の範囲   0x0000から0xFFFFまで   あるチャー構造。

追加のリソース:


3

Tcl

Tcl文字列はそれ以来、Unicode文字のシーケンスとなっています。Tcl 8.1(1999)。内部的には、それらはUTF-8(厳密にはJavaと同じModified UTF-8の取り扱いによるU+00000UCS-2(ホストのエンディアンとBOM、もちろん)。 OSとの通信に使用されるものを含め、すべての外部文字列(1つの例外を除く)は内部的にUnicodeであり、ホストに必要なエンコードに変換されます(または通信チャネルで手動で設定されます)。例外はデータがある場所です。2つの通信チャネル間でコピー直接コピーフリーのバイナリ転送が使用される一般的なエンコーディング(およびここでは関係ありませんが、その他のいくつかの制限もあります)。

BMP外の文字は現在、内部的にも外部的にも処理されていません。これは既知の問題です。


3

R6RSスキーム

Unicode 5.1の実装が必要です。すべての文字列は「Unicode形式」です。


3

C / C ++

C

C99より前のCでは、Unicodeサポートは組み込まれていません。それはゼロ終端文字配列を使います(char*またはchar[]文字列として)。 Acharバイト(8ビット)で指定します。

C99が指定wcs - 古い機能に加えてstr機能(例:strlen - >wcslen)これらの機能はwchar_t*の代わりにchar*wchar_tワイド文字タイプを表します。サイズwchar_tこれはコンパイラー固有のもので、最小8ビットまで可能です。コンパイラーが異なればサイズも異なりますが、通常は16ビット(UTF-16)または32ビット(UTF-32)です。

ほとんどのCライブラリ関数はUTF-8に対して透過的です。例えば。あなたのオペレーティングシステムがUTF-8をサポートしている場合(そしてUTF-8があなたのシステムの文字セットとして設定されている場合)、次にを使ってファイルを作成するfopenUTF-8でエンコードされた文字列を渡すと、適切な名前のファイルが作成されます。

C ++

C ++の状況はよく似ています(std::string - >std::wstring)、しかし少なくともある種のものを手に入れるための努力がある標準ライブラリでのUnicodeサポート


  • wchar_tに格納されたテキストは魔法のようにUnicodeになることはありません - しかし、まともなCプログラマーなら誰でもCで魔法のようには機能しないことを知っておくべきです:) - Chris Lutz
  • CとC ++は次の方法でUnicodeをサポートしていると言っても同じくらい正確です。char*UTF-8でエンコードされた文字列 - dan04
  • UTF-8は、C ++での使用にはより有用なエンコーディングと言われています。見るstackoverflow.com/questions/1049947/…そしてそれはchar *を介してネイティブにサポートされています - Pavel Radzivilovsky

3

Python

Python 2にはクラスがありますstrそしてunicodestrオブジェクトはバイトを格納します。unicodeオブジェクトはUTF-16文字を格納します。ほとんどのライブラリ関数は両方をサポートしています(例:os.listdir('.')のリストを返すstros.listdir(u'.')のリストを返すunicodeオブジェクト)。両方持っていますencodeそしてdecodeメソッド

Python 3は基本的に改名されましたunicodestr。に相当するPython 3str型になりますbytesbytesがありますdecodeそしてstrencode方法。Python 3.3以降 strオブジェクトは内部的にメモリを節約するためにいくつかのエンコーディングの一つを使います。 Pythonプログラマーにとっては、まだ抽象Unicodeシーケンスのように見えます。

Pythonは以下をサポートします。

  • エンコード/デコード
  • 正規化
  • 単純な大文字小文字変換と空白の分割
  • 名前で文字を探す

Pythonは次のものをサポートしていません。

  • 照合(限定)
  • 小文字と大文字の間に1:1のマッピングがない、特殊な場合の変換
  • 正規表現(それは働いています
  • テキスト分割
  • 双方向テキスト処理

また見なさい:PythonでのUnicodeに関する真実


  • Python版の要約と言及は良いでしょう(この記事は古くて、おそらくPython 3を扱っていないでしょう)。 - Joachim Sauer
  • 「500 Internal Server Error」が表示されます。そのリンク上。 - ulidtko

2

Common Lisp(SBCLとCLisp)

によるこのSBCLそしてクリックUnicodeをサポートします。


2

Objective-C

C文字列ライブラリの一部として利用可能であること以外は何も組み込まれていません。

ただし、一度フレームワークを追加すると…

財団(ココアとココアタッチ)とコア財団

NSStringとCFStringはそれぞれ完全にUnicodeベースの文字列クラスを実装しています(実装の詳細として、実際にはいくつかのクラス)。 2つは「フリーダイヤルブリッジ」であるため、一方のAPIはもう一方のインスタンスで使用でき、またその逆も可能です。

必ずしもテキストを表すとは限らないデータには、NSDataとCFDataがあります。 NSStringはメソッドを提供し、CFStringはテキストをデータにエンコードし、テキストをデータからデコードする機能を提供します。 Core Foundationは、あらゆる形式のUTFを含む、100種類以上のエンコードをサポートしています。エンコーディングは2つのグループに分けられます。組み込みエンコーディングどこでもサポートされている外部エンコーディング少なくともMac OS Xではサポートされています。

NSStringはフォームD、KD、C、またはKCに正規化するためのメソッドを提供します。それぞれ新しい文字列を返します。

NSStringとCFStringはどちらも、さまざまな比較/照合オプションを提供します。ここにあります財団の比較オプションフラグそしてCore Foundationの比較オプションフラグ。それらはすべて同義語ではありません。たとえば、Core Foundationはリテラル(厳密なコードポイントベース)比較をデフォルトにしますが、Foundationはリテラル以外の比較(アクセント記号付きの文字を比較できるようにする)をデフォルトにします。

Core FoundationはObjective-Cを必要としません。実際、Foundationのほとんどの機能をストレートCまたはC ++を使用したCarbonプログラマに提供するために作成されました。しかし、私はそれが最も現代的に使用されているのはCocoaまたはCocoa Touchプログラムであり、それらはすべてObjective-CまたはObjective-C ++で書かれていると思います。


2

D

DはUTF-8、UTF-16、およびUTF-32(それぞれchar、wchar、およびdchar)をサポートします。すべてのタイプのテーブルが見つかりますここに


2

さび

さびのひも(std::Stringそして&str)は常に有効なUTF-8であり、ヌルターミネータを使用しない。その結果、C / C ++などにある場合と同様に、配列としてインデックスを付けることはできない。.get1.20以降、コードポイントの中央をスライスしようとすると失敗するという警告があります。

錆もありますOsStr/OsStringホストOSと対話するため。 Unixのバイト配列です(任意のバイトシーケンスを含みます)。 WindowsではWTF-8(WindowsとJavascriptで許可されている不適切に形成されたUnicode文字列を処理するUTF-8のスーパーセット)、&strそしてString自由に変換することができますOsStrまたはOsStringしかし、他の方法で変換するためのチェックが必要です。無効なUnicodeで失敗したか、Unicodeの代替文字で置き換えられました。 (もありますPath/PathBufまわりのラッパーですOsStr/OsString

もありますCStrそしてCStringNullで終端されたC文字列を表す型OsStrUnixでは、それらは任意のバイトを含むことができます。

RustはUTF-16を直接サポートしていません。しかし変換することができますOsStr窓のUCS-2に。


1

PHP

すでにありますスレッド全体SOでこれに!


1

ルビー

私がRuby用に見つけることができる唯一のものはかなり古く、そしてルビストの多くではない、私はそれがどれほど正確であるかわからない。

記録として、Rubyはutf8をサポートしていますが、マルチバイトはサポートしていません。内部的には、通常は文字列がバイトベクトルであると想定していますが、物事を機能させるために通常使用できるライブラリとトリックがあります。

みつけたここに

Ruby 1.9

Ruby 1.9はエンコーディングを文字列に添付します。バイナリ文字列は "ASCII-8BIT"というエンコーディングを使います。最近のシステムではデフォルトのエンコーディングは通常UTF-8ですが、サードパーティのライブラリ関数がすべてこのエンコーディングの文字列を返すとは限りません。それは他のエンコーディングを返すかもしれません(例えば、いくつかのyamlパーサはいくつかの状況でそれを行います)。異なるエンコーディングの2つの文字列を連結すると、たぶん得るEncoding::CompatibilityError


  • Rubyには、unicodeを使うことを多くのユースケースにとって苦痛にするいくつかのバグがあります。redmine.ruby-lang.org/issues/show/2034 - Eduardo
  • Rubyがエンコーディングを処理する方法はばかげていると思います。 IMO文字列とバイト配列は2つの異なるものであるべきです。文字列は、それらに関連付けられているエンコーディングを持つべきではありません。それらは抽象的なUnicodeコードポイントシーケンスであるべきです。バイト配列をデコードすることでそれらを取得し、それをエンコードすることで文字列からバイト配列を取得する必要があります。これは他のほとんどすべての現代言語がすることです。 - panzi

0

アーク

ArcはUnicodeをサポートしていません。まだ


  • d< -1" I' d"著者が" Unicode support"と同等であるという事実に基づく記事(答えではありません!)。 「自転車の色が落ちる」まで。 - Joachim Sauer

0

取ります

Lua 5.3にはビルトインがありますutf8UTF-8エンコーディングを処理するライブラリ。これにより、一連のコードポイントを対応するバイトシーケンスに変換したり、その逆に変換したり、長さ(文字列内のコードポイント数)を取得したり、文字列内のコードポイントを反復処理したりします。n番目のコードポイント。また、パターンを提供します。これは、パターンマッチング関数によって使用されます。stringこれは1つのUTF-8バイトシーケンスと一致します。

Lua 5.3には、文字列リテラルで使用できるUnicodeコードポイントエスケープシーケンスがあります(例えば、"\u{61}"にとって"a")それらはUTF-8バイトシーケンスに変換されます。

Luaのソースコードは、UTF-8またはASCII文字が1バイトを占める任意のエンコーディングでエンコードできます。 UTF-16とUTF-32は、バニラルアのインタプリタには理解されません。ただし、文字列には任意のエンコード、または任意のバイナリデータを含めることができます。

リンクされた質問


関連する質問

最近の質問