UTF-8符号化のスペース(194 160)問題
3247 ワード
フロントの文字列はバックグラウンドに渡されて処理され、文字列の1つのスペース(ASCII:32)がUTF-8で符号化された後、奇妙な文字になった(ASCII:1994と160の組み合わせ)!しかし、バックグラウンドではその表象はスペースです.
UTF-8符号化には「0 xC 20 xA 0」という特殊な文字が存在し、文字に変換する際には半角スペースとして表現され、一般的な半角スペース(ASCII 0 x 20)とは異なり幅が圧縮されないため、レイアウトでよく用いられる.しかし、GB 2312やUnicodeなどにはこのような文字はないので、変換するとフロントに「?」と表示されます.番号は、本物の疑問符ではなく疑問符として表示されるだけなので、置き換えられません!
同じように見える2つの文字列を変換すると、元の文字列が「#'%$()-」であることが確認されます.{}.b「エスケープされた文字列は:」#'%$()-{}.b"【注:二重引用符は計算されず、byte配列に変換すると、元は16バイトで、その後のそれは17バイトである:これが32-->194 160の結果である】
この原因が分かったら、やりやすくなり、コードを書くことで194と160の組み合わせを変換することができます.プログラム(C#)は次のようになります.
より多くの符号化フォーマット対照表はこの文章を見ることができます:http://www.utf8-chartable.de/unicode-utf8-table.pl?utf8=dec
UTF-8符号化には「0 xC 20 xA 0」という特殊な文字が存在し、文字に変換する際には半角スペースとして表現され、一般的な半角スペース(ASCII 0 x 20)とは異なり幅が圧縮されないため、レイアウトでよく用いられる.しかし、GB 2312やUnicodeなどにはこのような文字はないので、変換するとフロントに「?」と表示されます.番号は、本物の疑問符ではなく疑問符として表示されるだけなので、置き換えられません!
同じように見える2つの文字列を変換すると、元の文字列が「#'%$()-」であることが確認されます.{}.b「エスケープされた文字列は:」#'%$()-{}.b"【注:二重引用符は計算されず、byte配列に変換すると、元は16バイトで、その後のそれは17バイトである:これが32-->194 160の結果である】
string tmp1 = "#' %$ ()_ -{}.b";
string tmp2 = "#' %$ ()_ -{}.b";
byte[] o1 = Encoding.UTF8.GetBytes(tmp1);
byte[] o2 = Encoding.UTF8.GetBytes(tmp2);
この原因が分かったら、やりやすくなり、コードを書くことで194と160の組み合わせを変換することができます.プログラム(C#)は次のようになります.
private string ChangeUTF8Space(string targetStr)
{
try
{
string currentStr = string.Empty;
byte[] utf8Space = new byte[] { 0xc2, 0xa0 };
string tempSpace = Encoding.GetEncoding("UTF-8").GetString(utf8Space);
currentStr = targetStr.Replace(tempSpace, " ");
return currentStr;
}
catch (Exception ex)
{
return targetStr;
}
}
より多くの符号化フォーマット対照表はこの文章を見ることができます:http://www.utf8-chartable.de/unicode-utf8-table.pl?utf8=dec