std.encoding
さまざまな文字コード
(※訳注: 以下では "encoding" を "文字コード" と訳しました) やその間の変換を扱うクラスと関数です。
コンパイル時に文字コードがわかっている場合用に、
文字の任意のエンコードやデコード、
別の型の文字列間の変換、バリデーションやサニタイズの関数が提供されています。
現在サポートされている文字コードは UTF-8, UTF-16, UTF-32, ASCII, ISO-8859-1
(別名 LATIN-1), WINDOWS-1252 です。
- 型 AsciiChar は ASCII 文字を表します。
- 型 AsciiString は ASCII 文字列を表します。
- 型 Latin1Char は ISO-8859-1 文字を表します。
- 型 Latin1String は ISO-8859-1 文字列を表します。
- 型 Windows1252Char は Windows-1252 文字を表します。
- 型 Windows1252String は Windows-1252 文字列を表します。
コンパイル時に文字コードが決まらず実行時に確定する場合のためには、
抽象クラス
EncodingScheme とその派生クラスを提供しています。
実行時にエンコーダ/デコーダを構築するには、次のようにします。
例:
auto e = EncodingScheme.create("utf-8");
ライブラリの提供する
EncodingScheme の派生クラスは ASCII,
ISO-8859-1 (別名 LATIN-1), WINDOWS-1252, UTF-8, (リトルエンディアン環境では)
UTF-16LE と UTF-32LE, (ビッグエンディアン環境では)
UTF-16BE と UTF-32BE に対応します。
このライブラリは、別の文字コードに対応する
EncodingScheme
を他のモジュールから追加するメカニズムを提供しています。
Source:std/encoding.d
License:Boost License 1.0
Authors:Janice Caron
- safeDecode の返す特殊な値
typedef
AsciiChar;
alias
AsciiString;
- ASCIIエンコードされた文字(列)を表す型
- Latin1エンコードされた文字を表す型
- Latin1エンコードされた文字列を表す型 (immutable(Latin1Char) の配列)
- Windows1252エンコードされた文字を表す型
- Windows1252エンコードされた文字列を表す型 (inmmutable(Windows1252Char) の配列)
bool
isValidCodePoint(dchar
c);
- c が有効なコードポイントなら true を返します
これには、文字を表さないコードポイント U+FFFE と U+FFFF も、
(有効な文字ではないにしろ) 有効なコードポイントなので
含まれることに注意してください。
Supercedes:
std.utf.startsValidDchar() の上位版です。
Standards:
Unicode 5.0, ASCII, ISO-8859-1, WINDOWS-1252
Parameters:
string
encodingName(T)();
- 文字コードの名前を返します。
文字コードの型を推論することはできません。
文字コード型は明示的に指定する必要があります。
Standards:
Unicode 5.0, ASCII, ISO-8859-1, WINDOWS-1252
Examples:
assert(encodingName!(Latin1Char) == "ISO-8859-1");
bool
canEncode(E)(dchar
c);
- 指定されたコードポイントをその文字コードで表現できるときにのみ、
true を返します。
文字コードの型を推論することはできません。
文字コード型は明示的に指定する必要があります。
Standards:
Unicode 5.0, ASCII, ISO-8859-1, WINDOWS-1252
Examples:
assert(canEncode!(Latin1Char)('A'));
bool
isValidCodeUnit(E)(E
c);
- コード単位が正当なものであれば true を返します。例えば、バイト 0x80 は
ASCII では不正です。なぜなら、ASCII のコード単位は
0x00 から 0x7F の範囲でなければならないからです。
Standards:
Unicode 5.0, ASCII, ISO-8859-1, WINDOWS-1252
Parameters:
bool
isValid(E)(const(E)[]
s);
- 文字列が正しくエンコードされていれば true を返します。
Supercedes:
この関数は std.utf.validate() の上位版ですが、こちらは
入力が正当か不正かを示す真偽値を返すのに対して、
旧関数は例外を投げていたことに注意してください。
Standards:
Unicode 5.0, ASCII, ISO-8859-1, WINDOWS-1252
Parameters:
size_t
validLength(E)(const(E)[]
s);
- 最初のコードから始めてできるだけ長い正しくエンコードされた部分文字列の
長さを返します。
Standards:
Unicode 5.0, ASCII, ISO-8859-1, WINDOWS-1252
Parameters:
immutable(E)[]
sanitize(E)(immutable(E)[]
s);
- 不正なコード単位を有効なコード単位に置き換えることで文字列をサニタイズします。
結果は指定の文字コードにおいて正しい文字列となることが保証されています。
入力文字列がすでに正当なものならば元の文字列をそのまま返し、
そうでなければ全ての不正なコード単位を
その文字コードの置き換え文字に替えた新しい文字列を作って返します。
不正な部分は、Unicode の置き換え文字 (U+FFFD) に対応する文字が
あればそれで、なければ '?' で
置き換えられます。
Standards:
Unicode 5.0, ASCII, ISO-8859-1, WINDOWS-1252
Parameters:
size_t
firstSequence(E)(const(E)[]
s);
- 先頭の文字に対応するエンコードされたシーケンスの長さを返します。
この関数の入力は正常にエンコードされている必要があります。
この条件は関数の事前条件で強制されます。
Standards:
Unicode 5.0, ASCII, ISO-8859-1, WINDOWS-1252
Parameters:
size_t
lastSequence(E)(const(E)[]
s);
- 末尾の文字に対応するエンコードされたシーケンスの長さを返します。
この関数の入力は正常にエンコードされている必要があります。
この条件は関数の事前条件で強制されます。
Standards:
Unicode 5.0, ASCII, ISO-8859-1, WINDOWS-1252
Parameters:
sizediff_t
index(E)(const(E)[]
s, int
n);
- n+1 番目のコードポイントが始まる配列のインデックスを返します。
この関数の入力は正常にエンコードされている必要があります。
この条件は関数の事前条件で強制されます。
Supercedes:
この関数は supercedes std.utf.toUTFindex() の上位版です
Standards:
Unicode 5.0, ASCII, ISO-8859-1, WINDOWS-1252
Parameters:
dchar
decode(S)(ref S
s);
- コードポイントを先頭から一つデコードします。
この関数は文字列の先頭から1つ以上のコード単位を取り除き、
それに対応するコードポイントを1つ返します。
この関数の入力は正常にエンコードされている必要があります。
この条件は関数の事前条件で強制されます。
Supercedes:
この関数は std.utf.decode() の上位版です。ただし、
関数 codePoints() の方がもっと便利です。
Standards:
Unicode 5.0, ASCII, ISO-8859-1, WINDOWS-1252
Parameters:
dchar
decodeReverse(E)(ref const(E)[]
s);
- コードポイントを末尾から一つデコードします。
この関数は文字列の末尾から1つ以上のコード単位を取り除き、
それに対応するコードポイントを1つ返します。
この関数の入力は正常にエンコードされている必要があります。
この条件は関数の事前条件で強制されます。
Standards:
Unicode 5.0, ASCII, ISO-8859-1, WINDOWS-1252
Parameters:
dchar
safeDecode(S)(ref S
s);
- 先頭のコードポイントをデコードします。入力が正当でない場合にも対応しています。
この関数は文字列の末尾から1つ以上のコード単位を取り除き、
それに対応するコードポイントを1つ返します。
この関数は、エンコードが不正な文字列を入力として受け取ることも可能です。
文字列の先頭に不正なシーケンスが見つかった場合、
その部分が取り除かれ、INVALID_SEQUENCE を返します。
Standards:
Unicode 5.0, ASCII, ISO-8859-1, WINDOWS-1252
Parameters:
size_t
encodedLength(E)(dchar
c);
- コードポイント1つを取り出すのに必要なコード単位の個数を返します。
この関数への入力は有効なコードポイントでなければなりません。
これは関数の事前条件で強制されます。
出力の型は自動推論されません。
テンプレート引数で明示的に文字コード型を指定する必要があります。
Standards:
Unicode 5.0, ASCII, ISO-8859-1, WINDOWS-1252
Parameters:
- コードポイント1つをエンコードします。
この関数は、単一のコードポイントを1つ以上のコード単位からなる配列へとエンコードします。
返値はエンコードされたコード単位を含む文字列です。
この関数への入力は有効なコードポイントでなければなりません。
これは関数の事前条件で強制されます。
出力の型は自動推論されません。
テンプレート引数で明示的に文字コード型を指定する必要があります。
Supercedes:
この関数は std.utf.encode() の上位版ですが、
関数 codeUnits() の方がより便利です。
Standards:
Unicode 5.0, ASCII, ISO-8859-1, WINDOWS-1252
Parameters:
size_t
encode(E)(dchar
c, E[]
array);
- コードポイント1つを配列 array へエンコードします。
この関数は、単一のコードポイントを1つ以上のコード単位からなる配列へとエンコードします。
結果は、
ユーザーから参照で渡される固定サイズの配列に格納されます。
この関数への入力は有効なコードポイントでなければなりません。
これは関数の事前条件で強制されます。
出力の型は自動推論されません。
テンプレート引数で明示的に文字コード型を指定する必要があります。
Supercedes:
この関数は std.utf.encode() の上位版ですが、
関数 codeUnits() の方がより便利です。
Standards:
Unicode 5.0, ASCII, ISO-8859-1, WINDOWS-1252
Parameters:
Returns:
array に書き込まれたコード単位の個数
void
encode(E)(dchar
c, void delegate(E)
dg);
- コードポイント1つを delegate へエンコードします。
この関数は、単一のコードポイントを1つ以上のコード単位へとエンコードします。
結果は、一つ一つ delegate に渡されます。
この関数への入力は有効なコードポイントでなければなりません。
これは関数の事前条件で強制されます。
出力の型は自動推論されません。
テンプレート引数で明示的に文字コード型を指定する必要があります。
Supercedes:
この関数は std.utf.encode() の上位版ですが、
関数 codeUnits() の方がより便利です。
Standards:
Unicode 5.0, ASCII, ISO-8859-1, WINDOWS-1252
Parameters:
CodePoints!(E)
codePoints(E)(immutable(E)[]
s);
- 文字列内のコードポイントを双方向に foreach
ループ可能な構造体を返します。
この関数の入力は正常にエンコードされている必要があります。
この条件は関数の事前条件で強制されます。
インデックスあり/なしのどちらの foreach ループも可能です。
インデックスが指定された場合、
文字列中での、
コードポイントが始まるインデックスに設定されます。
Supercedes:
この関数は std.utf.decode() の上位版です
Standards:
Unicode 5.0, ASCII, ISO-8859-1, WINDOWS-1252
Parameters:
Examples:
string s = "hello world";
foreach(c;codePoints(s))
{
}
現在のところ foreach(c; codePoints(s)) の方が、
U+FFFF で引っかかってしまう foreach(c;s) よりも優れています。
CodeUnits!(E)
codeUnits(E)(dchar
c);
- 文字に対応するコード単位の列を双方向に foreach
ループ可能な構造体を返します。
この関数への入力は有効なコードポイントでなければなりません。
これは関数の事前条件で強制されます。
出力の型は自動推論されません。
テンプレート引数で明示的に文字コード型を指定する必要があります。
Supercedes:
この関数は std.utf.encode() の上位版です。
Standards:
Unicode 5.0, ASCII, ISO-8859-1, WINDOWS-1252
Parameters:
Examples:
dchar d = '\u20AC';
foreach(c;codeUnits!(char)(d))
{
writefln("%X",c)
}
size_t
encode(Tgt, Src, R)(in Src[]
s, R
range);
- 文字列 s を型 E へエンコードし出力レンジ
R へと書き込みます。書き込まれた E の個数を返します。
void
transcode(Src, Dst)(immutable(Src)[]
s, out immutable(Dst)[]
r);
- ある文字コードの文字列を別の文字コードに変換します。 (下記の to!() もご参照ください)
この関数の入力は正常にエンコードされている必要があります。
この条件は関数の事前条件で強制されます。
Supercedes:
この関数は std.utf.toUTF8(), std.utf.toUTF16(),
std.utf.toUTF32() の上位版です。
(ただし、to!() の方が便利です。)
Standards:
Unicode 5.0, ASCII, ISO-8859-1, WINDOWS-1252
Parameters:
Examples:
wstring ws;
transcode("hello world",ws);
Latin1String ls;
transcode(ws, ls);
class
EncodingException: object.Exception;
- このモジュールが投げる例外の基底クラス
abstract class
EncodingScheme;
- 全ての文字コードスキームの抽象基底クラス
static void
register(string
className);
- EncodingScheme の派生クラスを登録
この関数によって、他のモジュールで宣言された EncodingScheme
の派生クラスを登録することができます。
Examples:
class Amiga1251 : EncodingScheme
{
shared static this()
{
EncodingScheme.register("path.to.Amiga1251");
}
}
static EncodingScheme
create(string
encodingName);
- 指定された名前の文字コードのエンコード/デコードができる
EncodingScheme の派生クラスのインスタンスを取得
この関数は、register() で登録された EncodingScheme
のみを扱います。
Examples:
auto scheme = EncodingScheme.create("Amiga-1251");
abstract const string
toString();
- 文字コードスキームの標準的な名前を返します。
abstract const string[]
names();
- 使用できる文字コードスキーム名全ての配列を返します。
abstract const bool
canEncode(dchar
c);
- 文字 c がこの文字コードスキームで表現できるなら
true を返します。
abstract const size_t
encodedLength(dchar
c);
- 指定されたコードポイントを表現するのに必要なバイト数を返します。
入力は有効なコードポイントでなければなりません。
Parameters:
Returns:
必要なバイト数
abstract const size_t
encode(dchar
c, ubyte[]
buffer);
- 指定されたコードポイントをエンコードして、ユーザの渡した固定サイズ buffer に格納。
この関数は、単一のコードポイントを1つ以上のubyteへとエンコードします。
指定する buffer はコード単位にalignされている必要があります。
(例えば、UTF-16LE や UTF-16BE は wchar-align、
UTF-32LE や UTF-32BE は dchar-aligne など)
入力は有効なコードポイントでなければなりません。
Parameters:
Returns:
書き込まれたバイト数
abstract const dchar
decode(ref const(ubyte)[]
s);
- 先頭のコードポイントをデコードします。
この関数は配列の先頭から1バイト以上取り除き、
その部分が表現するコードポイントをデコードして返します。
この関数の入力は正常にエンコードされている必要があります。
Parameters:
const(ubyte)[] s |
コードポイントのデコード元文字列 |
abstract const dchar
safeDecode(ref const(ubyte)[]
s);
- 先頭のコードポイントをデコードします。入力が正当でない場合にも対応します。
この関数は配列の末尾から1バイト以上のデータを取り除き、
それに対応するコードポイントを1つ返します。
この関数は、エンコードが不正な配列を入力として受け取ることも可能です。
配列の先頭に不正なシーケンスが見つかった場合、
その部分が取り除かれ、INVALID_SEQUENCE を返します。
Parameters:
const(ubyte)[] s |
先頭の文字をデコードする対象の文字列 |
abstract const immutable(ubyte)[]
replacementSequence();
- 現在の文字コードスキームで表現できない文字に対する
代替バイト列を返します。
通常、これは
U+FFFD や '?' のような代替文字になります。
bool
isValid(const(ubyte)[]
s);
- 配列が正しくエンコードされていると true を返します。
Parameters:
const(ubyte)[] s |
チェック対象の配列 |
size_t
validLength(const(ubyte)[]
s);
- 配列の先頭から始まってできるだけ長い正当なエンコードの文字列の長さを
返します。
Parameters:
const(ubyte)[] s |
チェック対象の配列 |
immutable(ubyte)[]
sanitize(immutable(ubyte)[]
s);
- 不正なバイト列を有効なバイト列に置き換えることで文字列をサニタイズします。
結果は指定の文字コードにおいて
正しいバイト列となることが保証されています。
入力バイト列がすでに正当なものならば元のバイト列をそのまま返し、
そうでなければ全ての不正なバイト列を
その文字コードの置き換え文字に替えた新しい文字列を作って返します。
Parameters:
immutable(ubyte)[] s |
サニタイズ対象の文字列 |
size_t
firstSequence(const(ubyte)[]
s);
- 先頭の文字に対応するエンコードされたシーケンスの長さを返します。
この関数の入力は正常にエンコードされている必要があります。
この条件は関数の事前条件で強制されます。
Parameters:
const(ubyte)[] s |
スライスする文字列 |
size_t
count(const(ubyte)[]
s);
- バイト列中にエンコードされたコードポイントの総数を返します。
この関数の入力は正常にエンコードされている必要があります。
この条件は関数の事前条件で強制されます。
Parameters:
const(ubyte)[] s |
カウント対象の文字列 |
sizediff_t
index(const(ubyte)[]
s, int
n);
- n+1 番目のコードポイントが始まる配列のインデックスを返します。
この関数の入力は正常にエンコードされている必要があります。
この条件は関数の事前条件で強制されます。
Parameters:
const(ubyte)[] s |
カウント対象の文字列 |
class
EncodingSchemeASCII: std.encoding.EncodingScheme;
- ASCII を扱う文字コードスキーム
このスキームの別名は以下の通りです。
"ANSI_X3.4-1968",
"ANSI_X3.4-1986",
"ASCII",
"IBM367",
"ISO646-US",
"ISO_646.irv:1991",
"US-ASCII",
"cp367",
"csASCII"
"iso-ir-6",
"us"
class
EncodingSchemeLatin1: std.encoding.EncodingScheme;
- Latin-1 を扱う文字コードスキーム
このスキームの別名は以下の通りです。
"CP819",
"IBM819",
"ISO-8859-1",
"ISO_8859-1",
"ISO_8859-1:1987",
"csISOLatin1",
"iso-ir-100",
"l1",
"latin1"
class
EncodingSchemeWindows1252: std.encoding.EncodingScheme;
- Windows-1252 を扱う文字コードスキーム
このスキームの別名は以下の通りです。
"windows-1252"
class
EncodingSchemeUtf8: std.encoding.EncodingScheme;
- UTF-8 を扱う文字コードスキーム
このスキームの別名は以下の通りです。
"UTF-8"
class
EncodingSchemeUtf16Native: std.encoding.EncodingScheme;
- UTF-16 をネイティブのバイト順で扱う文字コードスキーム
このスキームの別名は以下の通りです。
"UTF-16LE" (リトルエンディアン環境のみ)
"UTF-16BE" (ビッグエンディアン環境のみ)
class
EncodingSchemeUtf32Native: std.encoding.EncodingScheme;
- UTF-32 をネイティブのバイト順で扱う文字コードスキーム
このスキームの別名は以下の通りです。
"UTF-32LE" (リトルエンディアン環境のみ)
"UTF-32BE" (ビッグエンディアン環境のみ)