2016-03-03 25 views
3

我正在爲空格檢查日文字符串並用「_」替換它們。 這是我在做什麼:在C中比較日文字符

string input1="abc dfg"; 
string input2="尾え れ"; 
if(input1.Contains(" ")) 
{ 
    Console.WriteLine(input1.Replace(" ","_")); 
} 
Console.WriteLine("------------------"); 
if(input2.Contains(" ")) 
{ 
    Console.WriteLine(input2.Replace(" ","_")); 
} 

這裏是這段代碼

abc__dfg 
------------------ 

輸出它代替空格用「_」在簡單的英文字符串,但在日本的字符串沒有。

+8

,因爲它不是一個空間,它不是相同的字符,從輸入2字符串複製你稱之爲「空格」的內容並將其粘貼到input2中。替換方法,它將工作,它只是不同於你鍵入的空間字符(即使當我嘗試在這裏選擇它在stackoverflow它的兩倍大的空間在input1,所以它不能是相同的字符) –

+0

@RonanThibaudau你怎麼能注意到那個? ;) – Ian

+2

@Ian是我直覺直覺閱讀的問題,所以開始選擇它來粘貼並檢查實際數據,發現它是兩倍的寬度(第一個字符串中的兩個空格與第二個字符中的兩個空格,總計相同的寬度) –

回答

8

因爲在你input2外觀般的空間是不是一個真正的空間,只是檢查它的ASCII碼

Console.WriteLine(Convert.ToInt32(' ')); // output: 12288 
Console.WriteLine(Convert.ToInt32(' ')); // output: 32 

string input1 = "abc dfg"; 
string input2 = "尾え れ"; // a space 
string input3 = "尾え れ"; // not a space 
if (input1.Contains(" ")) 
{ 
    Console.WriteLine(input1.Replace(" ", "_")); 
} 
Console.WriteLine("------------------"); 
if (input2.Contains(" ")) 
{ 
    Console.WriteLine(input2.Replace(" ", "_")); 
} 
Console.WriteLine("------------------"); 
if (input3.Contains(" ")) 
{ 
    Console.WriteLine(input3.Replace(" ", "_")); 
} 

@Ronan Thibaudau的原始解釋:

因爲它不是一個空間,它不是一樣的字符,複製你所調用的一個「空間」 ,從輸入2字符串並將其粘貼到 input2.replace方法,它將工作,它只是不一樣 字符作爲您鍵入的空間(即使當我嘗試在這裏選擇它在這裏012over.overview它是它的兩倍大在你輸入1位,因此 不能是同一個字符)

+2

'Ronan Thibaudau'在評論中有一個明確的解釋讓他提出答案。或在你的回答中提及他。我認爲這可能更明顯。 –

+0

@ un-lucky:我在他的回答中加入了他的評論 –

+0

這是騙子....!在投票中檢查我的貢獻 –

0

最有可能您的控制檯字體不支持和/或(默認)代碼頁不支持日文字符。

嘗試

 Console.WriteLine(Console.OutputEncoding.EncodingName); 
    Console.WriteLine(Console.OutputEncoding.CodePage); 
    Console.WriteLine(input2); 
    Debug.Write(input2); 

進行比較。選擇支持日文字符的字體和代碼頁,例如

Console.OutputEncoding = Encoding.UTF8; 

爲了改變你的控制檯的默認代碼頁,請這樣的回答:Unicode characters in Windows command line - how?

關於字符串本身: 複製/粘貼的串尾え れ本方:Unicode code converter。 Unicode代碼點是U+5C3E U+3048 U+3000 U+308C

U+3000Ideographic Space,而不是「正常」空間U+0020

0

使用這段代碼的第二個字符串,它會工作。經過測試並返回正確的輸出。

if (input2.Contains(string.Empty)) 
    { 
     string cleanedString = System.Text.RegularExpressions.Regex.Replace(input2, @"\s+", "_"); 
     Console.WriteLine(cleanedString); 
    } 
0

如果你不想擔心自己與ASCII碼或複製粘貼文字,你不知道如何期待,只是做這樣的事情:

//using System.Linq; 
string input1 = "abc dfg"; 
string input2 = "尾え れ"; 
if (input1.Any(char.IsWhiteSpace)) 
{ 

    Console.WriteLine(new string(input1.Select(x=> char.IsWhiteSpace(x) ? '_' : x).ToArray())); 
} 
Console.WriteLine("------------------"); 
if (input2.Any(char.IsWhiteSpace)) 
{ 

    Console.WriteLine(new string(input2.Select(x => char.IsWhiteSpace(x) ? '_' : x).ToArray())); 
}