@ishisaka 前のDPで試したときはサロゲートペアダメだったけど、ベータではどうなっただろ…
— kkamegawa (@kkamegawa) 2012, 3月 6
@kkamegawaさんが左様な事を仰っていたので、UTF-16エンコードの試験をかねて、Windows 8 Consumer Preview上のVisual Studio 11, .NET Framework 4.5で検証してみました。
<span class="hljs-keyword">using</span> System;
<span class="hljs-keyword">using</span> System.Collections.Generic;
<span class="hljs-keyword">using</span> System.Linq;
<span class="hljs-keyword">using</span> System.Text;
<span class="hljs-keyword">namespace</span> ConsoleEncodeTest
{
class Program
{
<span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> Main(<span class="hljs-keyword">string</span>[] args) {
<span class="hljs-keyword">string</span> notSurrogatePair = <span class="hljs-string">"叱る"</span>;
<span class="hljs-comment">//新常用漢字表での叱るの字形はUTF-16だとサロゲートペア文字になる</span>
<span class="hljs-comment">//参考 http://ja.wiktionary.org/wiki/%F0%A0%AE%9F</span>
<span class="hljs-keyword">string</span> SurrogatePair = <span class="hljs-keyword">char</span>.ConvertFromUtf32(<span class="hljs-number">0x20B9F</span>) + <span class="hljs-string">"る"</span>;
<span class="hljs-comment">//標準のエンコードを表示。しかし!ここで表示されるのはShift_JISで</span>
<span class="hljs-comment">//Windows-31Jじゃない!!うそつきー!!</span>
<span class="hljs-built_in">Console</span>.WriteLine(<span class="hljs-string">"IANA Name : {0}"</span>, <span class="hljs-built_in">Console</span>.OutputEncoding.WebName);
<span class="hljs-comment">//確認のためコードページも表示。932って表示されるよ!</span>
<span class="hljs-built_in">Console</span>.WriteLine(<span class="hljs-string">"Code Page : {0}"</span>, <span class="hljs-built_in">Console</span>.OutputEncoding.CodePage);
<span class="hljs-comment">//UTF-8 BOM無しを指定してみる</span>
<span class="hljs-built_in">Console</span>.OutputEncoding = <span class="hljs-keyword">new</span> UTF8Encoding();
<span class="hljs-comment">//utf-8</span>
<span class="hljs-built_in">Console</span>.WriteLine(<span class="hljs-string">"IANA Name : {0}"</span>, <span class="hljs-built_in">Console</span>.OutputEncoding.WebName);
<span class="hljs-comment">//65001が表示される。</span>
<span class="hljs-built_in">Console</span>.WriteLine(<span class="hljs-string">"Code Page : {0}"</span>, <span class="hljs-built_in">Console</span>.OutputEncoding.CodePage);
<span class="hljs-comment">//UTF-16 LE, BOM無しを指定する</span>
<span class="hljs-built_in">Console</span>.OutputEncoding = <span class="hljs-keyword">new</span> UnicodeEncoding();
<span class="hljs-comment">//utf-16</span>
<span class="hljs-built_in">Console</span>.WriteLine(<span class="hljs-string">"IANA Name : {0}"</span>, <span class="hljs-built_in">Console</span>.OutputEncoding.WebName);
<span class="hljs-comment">//1200</span>
<span class="hljs-built_in">Console</span>.WriteLine(<span class="hljs-string">"Code Page : {0}"</span>, <span class="hljs-built_in">Console</span>.OutputEncoding.CodePage);
<span class="hljs-comment">//文字列の表示</span>
<span class="hljs-comment">//非サロゲートペア文字</span>
<span class="hljs-built_in">Console</span>.WriteLine(notSurrogatePair);
<span class="hljs-comment">//サロゲートペア文字</span>
<span class="hljs-built_in">Console</span>.WriteLine(SurrogatePair);
<span class="hljs-built_in">Console</span>.Read();
}
}
}
<span class="hljs-keyword">using</span> System;
<span class="hljs-keyword">using</span> System.Collections.Generic;
<span class="hljs-keyword">using</span> System.Linq;
<span class="hljs-keyword">using</span> System.Text;
<span class="hljs-keyword">namespace</span> ConsoleEncodeTest
{
class Program
{
<span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> Main(<span class="hljs-keyword">string</span>[] args) {
<span class="hljs-keyword">string</span> notSurrogatePair = <span class="hljs-string">"叱る"</span>;
<span class="hljs-comment">//新常用漢字表での叱るの字形はUTF-16だとサロゲートペア文字になる</span>
<span class="hljs-comment">//参考 http://ja.wiktionary.org/wiki/%F0%A0%AE%9F</span>
<span class="hljs-keyword">string</span> SurrogatePair = <span class="hljs-keyword">char</span>.ConvertFromUtf32(<span class="hljs-number">0x20B9F</span>) + <span class="hljs-string">"る"</span>;
<span class="hljs-comment">//標準のエンコードを表示。しかし!ここで表示されるのはShift_JISで</span>
<span class="hljs-comment">//Windows-31Jじゃない!!うそつきー!!</span>
<span class="hljs-built_in">Console</span>.WriteLine(<span class="hljs-string">"IANA Name : {0}"</span>, <span class="hljs-built_in">Console</span>.OutputEncoding.WebName);
<span class="hljs-comment">//確認のためコードページも表示。932って表示されるよ!</span>
<span class="hljs-built_in">Console</span>.WriteLine(<span class="hljs-string">"Code Page : {0}"</span>, <span class="hljs-built_in">Console</span>.OutputEncoding.CodePage);
<span class="hljs-comment">//UTF-8 BOM無しを指定してみる</span>
<span class="hljs-built_in">Console</span>.OutputEncoding = <span class="hljs-keyword">new</span> UTF8Encoding();
<span class="hljs-comment">//utf-8</span>
<span class="hljs-built_in">Console</span>.WriteLine(<span class="hljs-string">"IANA Name : {0}"</span>, <span class="hljs-built_in">Console</span>.OutputEncoding.WebName);
<span class="hljs-comment">//65001が表示される。</span>
<span class="hljs-built_in">Console</span>.WriteLine(<span class="hljs-string">"Code Page : {0}"</span>, <span class="hljs-built_in">Console</span>.OutputEncoding.CodePage);
<span class="hljs-comment">//UTF-16 LE, BOM無しを指定する</span>
<span class="hljs-built_in">Console</span>.OutputEncoding = <span class="hljs-keyword">new</span> UnicodeEncoding();
<span class="hljs-comment">//utf-16</span>
<span class="hljs-built_in">Console</span>.WriteLine(<span class="hljs-string">"IANA Name : {0}"</span>, <span class="hljs-built_in">Console</span>.OutputEncoding.WebName);
<span class="hljs-comment">//1200</span>
<span class="hljs-built_in">Console</span>.WriteLine(<span class="hljs-string">"Code Page : {0}"</span>, <span class="hljs-built_in">Console</span>.OutputEncoding.CodePage);
<span class="hljs-comment">//文字列の表示</span>
<span class="hljs-comment">//非サロゲートペア文字</span>
<span class="hljs-built_in">Console</span>.WriteLine(notSurrogatePair);
<span class="hljs-comment">//サロゲートペア文字</span>
<span class="hljs-built_in">Console</span>.WriteLine(SurrogatePair);
<span class="hljs-built_in">Console</span>.Read();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleEncodeTest
{
class Program
{
static void Main(string[] args) {
string notSurrogatePair = "叱る";
//新常用漢字表での叱るの字形はUTF-16だとサロゲートペア文字になる
//参考 http://ja.wiktionary.org/wiki/%F0%A0%AE%9F
string SurrogatePair = char.ConvertFromUtf32(0x20B9F) + "る";
//標準のエンコードを表示。しかし!ここで表示されるのはShift_JISで
//Windows-31Jじゃない!!うそつきー!!
Console.WriteLine("IANA Name : {0}", Console.OutputEncoding.WebName);
//確認のためコードページも表示。932って表示されるよ!
Console.WriteLine("Code Page : {0}", Console.OutputEncoding.CodePage);
//UTF-8 BOM無しを指定してみる
Console.OutputEncoding = new UTF8Encoding();
//utf-8
Console.WriteLine("IANA Name : {0}", Console.OutputEncoding.WebName);
//65001が表示される。
Console.WriteLine("Code Page : {0}", Console.OutputEncoding.CodePage);
//UTF-16 LE, BOM無しを指定する
Console.OutputEncoding = new UnicodeEncoding();
//utf-16
Console.WriteLine("IANA Name : {0}", Console.OutputEncoding.WebName);
//1200
Console.WriteLine("Code Page : {0}", Console.OutputEncoding.CodePage);
//文字列の表示
//非サロゲートペア文字
Console.WriteLine(notSurrogatePair);
//サロゲートペア文字
Console.WriteLine(SurrogatePair);
Console.Read();
}
}
}
これの実行結果がこちら
サロゲートペア文字はおそらくフォントの関係か、コンソールホストの問題で文字化けしているが、特にエラーで落ちたりすることは無いです。
この点はDPよりカイゼンされているようです。
ん? うん? まてまて。
最初のエンコードがutf-8になってるじゃ無いか。えー!まじっすか?またしても大きな疑問点が。。。
(追記:0:49) コンソールからEXEを起動すると最初のエンコーディングとコードページはCP932なので、どうもVS11からデバッグをかけた場合らしいです。デバッグ無しで実行した場合も同様でした。
それよりもサロゲートペア文字があると記事を投稿できないWordPressに困った。。。(CodeColorプラグインの問題かもしれないけど)
コメント