[VB.NET] "n"とかは書式文字列ではなく文字リテラル # 危険性(改) その1

2010年6月6日

 String.Formatの危険性(改) その1 です。「String.Formatの危険性(改) その0」からの続きです。

 "n"とかは書式文字列ではなく文字リテラルです。ここが勘違いの大元でした。つまり、

string.Format("時刻:{0:HH:mm:ss}t内容:{1}n", System.DateTime.Now, msg);

と書いたとき、、色がついた部分が全て書式指定文字列だと勘違いしたわけです。ところが、赤色の箇所は書式指定文字列ではなく、エスケープ表現の文字リテラルだったわけです。

 エスケープ表現はC#とVBで異なっていて、以下に詳細があります。

C#のエスケープ
 http://msdn.microsoft.com/ja-jp/library/aa691087.aspx
VBのエスケープ
 http://msdn.microsoft.com/ja-jp/library/aa711652.aspx

 …VBはダブルクォーテーションだけなんですね、って感じです。   

 つまり"n"はあくまで文字リテラルなので、String.Formatを使うまでもなく、文字列代入でも使用でき、有効です。

C#

class Program
{
    static void Main(string[] args)
    {
        string s = "AAAAnBBBB";

        byte[] b = System.Text.Encoding.UTF8.GetBytes(s);
        System.Console.WriteLine(System.BitConverter.ToString(b));
    }
}

結果

41-41-41-41-0A-42-42-42-42

 上記の通り、"n"の部分は内部的には CR(0x0D) になっています。 しかしVBで似たコードを書くと、エスケープは効かないので、表記通り "n" (0x5C - 0x6E) となっています。

Module Module1
    Sub Main()
        Dim s As String = "AAAAnBBBB"

        Dim b As Byte() = System.Text.Encoding.UTF8.GetBytes(s)
        System.Console.WriteLine(System.BitConverter.ToString(b))
    End Sub
End Module

結果

41-41-41-41-5C-6E-42-42-42-42

つづく






カテゴリー: C#, Program, VB.NET

Follow comments via the RSS Feed | Leave a comment | Trackback URL

2 Comments to "[VB.NET] "n"とかは書式文字列ではなく文字リテラル # 危険性(改) その1"

  1. オールトの雲

    [C#] 逐語的文字列

     String.Formatの危険性(改) その2 です。「"n"とかは書式文字列ではなく文字リテラル」からの続きです。

  2. [VB.NET] String.Formatの危険性(改) その0 | オールトの雲

    [...]  ということで、訂正記事の作成を試みてみます。 つづく [...]

コメントを投稿する

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


«   »
 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org