C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

(C#.NET)エスケープシーケンスについて


(過去ログ 2 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■2201 / inTopicNo.1)  (C#.NET)エスケープシーケンスについて
  
□投稿者/ とおりすがり 二等兵(1回)-(2005/12/26(Mon) 08:56:14)

分類:[C#] 


分類:[C#] 

いつも参考にさせていただいています。
C#.NETでの円マークの扱いについての質問です。
(以下、半角円マーク「¥」は「\」と表示されますのでご留意下さい)

 [string abc = "C:\Program Files";]のように記述すると
 構文エラーが発生するため、
 [string abc = @"C:\ProgramFiles";]のように
 エスケープシーケンス文字として読ませるよう記述すると思います。

 ところが、何故か改行コードは[string abc = "\r\n";]と記述しても
 構文エラーが発生しません。もちろん[string def = @"\r\n";]としても
 構文エラーは発生しないのですが、この両者、[if (abc == def)]のように
 比較してみると、どうやら文字コード自体は違う文字列として扱われる
 ようなのです。

 質問-------------------------------------------------------
 「エスケープシーケンスって何?」というところが
 よく分かっていないのが現状ですが、以下、質問させてください。
  質問1)[@]付きの文字列と[@]無しの文字列、何が違うのか?
  質問2)[@]付きの文字列を[@]無しの文字列に変換できないか?
 -----------------------------------------------------------

 困っている事-----------------------------------------------
 XMLファイルから[\r\n](改行コード)付きの文字列を取得し
 それをグレープシティー社の[ElTabelle(エルタブレ)]にセット
 すると改行されず[\r\n]が文字列としてそのまま表示された。

 原因は、文字列[\r\n]をC#.NETが「エスケープシーケンス文字」
 として文字列を[@]付きにセットしていたため。
 [@"\r\n"]→["\r\n"]に変換しElTabelleに入れると改行出来た。
 以上のことから、[@"\"]→["\"]に変換するメソッドを作成したい。
 -----------------------------------------------------------

以上、長文になりましたがよろしくお願い致します。


0
引用返信 編集キー/
■2202 / inTopicNo.2)  Re[1]: (C#.NET)エスケープシーケンスについて
□投稿者/ Blue 一等兵(9回)-(2005/12/26(Mon) 10:43:02)

分類:[C#] 

とりあえず、MSDN 2-2-4  定数表記
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdnbcsharp/htm/csharp2-2.asp

>  ところが、何故か改行コードは[string abc = "\r\n";]と記述しても
> 構文エラーが発生しません。もちろん[string def = @"\r\n";]としても
> 構文エラーは発生しないのですが、この両者、[if (abc == def)]のように
> 比較してみると、どうやら文字コード自体は違う文字列として扱われる
> ようなのです。
def = @"\r\n"; は def = "\\r\\n"; という風になり、エスケープシーケンスとして扱われません。



0
引用返信 編集キー/
■2205 / inTopicNo.3)  Re[1]: (C#.NET)エスケープシーケンスについて
□投稿者/ bell 二等兵(1回)-(2005/12/28(Wed) 11:50:04)

分類:[C#] 

エスケープシークエンスの考え方が間違っています。

No2201に返信(とおりすがりさんの記事)
>  [string abc = "C:\Program Files";]のように記述すると
>  構文エラーが発生するため、
>  [string abc = @"C:\ProgramFiles";]のように
>  エスケープシーケンス文字として読ませるよう記述すると思います。

逆です。文字列に"\"があった場合、
その直後の1文字とあわせて"エスケープシークエンス1文字"として解釈します。
(\n、\t、etc...)
文字列内で単純に文字"\"を使いたい場合、"\\"と記述する必要があります。
つまり
"C:\Program Files"という文字列は
"C:"という文字列、
"\P"というエスケープシークエンス、
"rogram Files"という文字列、
この3つでできていることになります。
\Pというエスケープシクエンスは存在していないため、
構文エラーが発生してしまいます。
("\r"も"\n"も両方ともエスケープシークエンスのため構文エラーにはなりません)

@を文字列の前につけた場合には、
直後の文字列内の"\"を自動的に"\\"として扱うため、
@"C:\Program Files"という文字列は"C:\\Program Files"と等価になるわけです。

@"\"から"\"への変換処理ですが、
エスケープシークエンスは"\"+後ろの1文字という形をとるため、
"\\"の後ろの1文字を参照して対応したエスケープシークエンスに置き換える、
という動きになると思うので一筋縄ではいかないと思います。

単純に@"\〜"を"\〜"にReplaceメソッドにて置き換えてしまうのはどうでしょうか?
お困りの件は
@"\r"("\\r")を\r",@"\n"("\\n")を"\n"にReplaceしてあげれば実現できると思います。


0
引用返信 編集キー/
■2207 / inTopicNo.4)  Re[1]: (C#.NET)エスケープシーケンスについて
□投稿者/ trapemiya 中尉(35回)-(2005/12/29(Thu) 09:56:58)
trapemiya さんの Web サイト

分類:[C#] 

Regex.Unescape メソッドを調べてみて下さい。

0
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -