|
■No93883 (tani さん) に返信
> これはなぜなのでしょうか?
C# では、文字集合として Unicode をベースにしていますが、
その符号化方式は UTF-8 ではありません。
Windows が使う Unicode では、エンコードとして UCS-2 あるいは UTF-16 をベースとしています。
これは細かい事を端折っていえば、すべての文字が 2 バイト(16bit) で表されるエンコーディングであり、
.NET の System.String や System.Char もコレです。
using System;
using System.Diagnostics;
using System.Globalization;
using System.Text;
class Program
{
static void Main()
{
// 'U+0000〜U+007F の範囲の文字は、UTF-8 では 1 バイトとなる
WriteStringLength("\u0043");
WriteStringLength("\u0023");
Debug.WriteLine("");
// 'U+0080〜U+07FF の範囲の文字は、UTF-8 では 2 バイトとなる
WriteStringLength("\u03B2");
WriteStringLength("\u0414");
Debug.WriteLine("");
// 'U+0800〜U+FFFF の範囲の文字は、UTF-8 では 3 バイトとなる
WriteStringLength("\u3042");
WriteStringLength("\u4f60");
WriteStringLength("\uFF8F");
Debug.WriteLine("");
// 'U+10000〜U+1FFFF の範囲の文字は、UTF-8 では 4 バイトとなる
WriteStringLength("\U0001F60A");
WriteStringLength("\U00020BB7");
WriteStringLength("\U00020B9F");
Debug.WriteLine("");
}
static void WriteStringLength(string s)
{
Debug.WriteLine(String.Format(
"文字=[{0}], 文字数={1}, Char数={2}、UTF-8={3}, UTF-16={4}",
s,
new StringInfo(s).LengthInTextElements,
s.ToCharArray().Length,
Encoding.GetEncoding("UTF-8").GetByteCount(s),
Encoding.GetEncoding("UTF-16").GetByteCount(s)
));
}
}
|