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#] 逐語的文字列
String.Formatの危険性(改) その2 です。「"n"とかは書式文字列ではなく文字リテラル」からの続きです。
Link | 2010年6月6日 01:03
[VB.NET] String.Formatの危険性(改) その0 | オールトの雲
[...] ということで、訂正記事の作成を試みてみます。 つづく [...]
Link | 2012年10月20日 14:36