スポンサーリンク

.NET Console出力のエンコード(文字コード)を変更する .NET 4.5編 (I18N)

@kkamegawaさんが左様な事を仰っていたので、UTF-16エンコードの試験をかねて、Windows 8 Consumer Preview上のVisual Studio 11, .NET Framework 4.5で検証してみました。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<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プラグインの問題かもしれないけど)

コメント

タイトルとURLをコピーしました