正如它在標題行中所說的,我想在C#中將Zenkaku字符轉換爲hankaku和vice-vrsa,但無法弄清楚如何去做。所以,說「ラーメン」到「ラーメン」,反過來說。 能否根據輸入的格式將其寫入一個自動確定轉換需要進行的方式的方法中?在C中將全角字符轉換爲hankaku,反之亦然#
6
A
回答
2
您可以通過包括Microsoft.VisualBasic.dll中參考使用Strings.StrConv()方法,或者你可以P/Invoke的LCMapString()本地功能:
private const uint LOCALE_SYSTEM_DEFAULT = 0x0800;
private const uint LCMAP_HALFWIDTH = 0x00400000;
public static string ToHalfWidth(string fullWidth)
{
StringBuilder sb = new StringBuilder(256);
LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_HALFWIDTH, fullWidth, -1, sb, sb.Capacity);
return sb.ToString();
}
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
private static extern int LCMapString(uint Locale, uint dwMapFlags, string lpSrcStr, int cchSrc, StringBuilder lpDestStr, int cchDest);
,你可以也做相反的事情:
private const uint LCMAP_FULLWIDTH = 0x00800000;
public static string ToFullWidth(string halfWidth)
{
StringBuilder sb = new StringBuilder(256);
LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_FULLWIDTH, halfWidth, -1, sb, sb.Capacity);
return sb.ToString();
}
至於檢測輸入字符串的格式,我不知道一個簡單的方法,而不先做轉換並比較結果。 (如果字符串同時包含全角和半角字符,該怎麼辦?)
1
一種方法是編譯您想要轉換的所有字符的列表以及它們如何映射到對方,然後迭代輸入字符串並將列表中的所有字符替換爲其等效字符。
var fullToHalf = new Dictionary<char, char>
{
...
{ '\u30E9', '\uFF97' }, // KATAKANA LETTER RA -> HALFWIDTH KATAKANA LETTER RA
{ '\u30EA', '\uFF98' }, // KATAKANA LETTER RI -> HALFWIDTH KATAKANA LETTER RI
...
};
var halfToFull = fullToHalf.ToDictionary(kv => kv.Value, kv => kv.Key);
var input = "\u30E9";
var isFullWidth = input.All(ch => fullToHalf.ContainsKey(ch));
var isHalfWidth = input.All(ch => halfToFull.ContainsKey(ch));
var result = new string(input.Select(ch => fullToHalf[ch]).ToArray());
// result == "\uFF97"
+0
感謝您的建議。我用一個字符串思考了這樣的事情。包含所有字符的包含和數組,但是我想知道需要的時間。字典看起來很整潔,所以我可能會放棄這一點。 –
+0
只是說:非常感謝您的建議。我喜歡這種方法,但對於我試圖達到的目標而言過於複雜。還有一個潛在的問題是我需要事先創建字典...有點奇怪,當VB使用StrConv()方法時,這應該是在純C#中執行此操作的唯一方法。 –
相關問題
- 1. Hankaku與Zenkaku,反之亦然在Java中
- 2. 將字符串轉換爲數字,反之亦然C(NOT C++)
- 3. 在c#中將Uint64轉換爲5字節,反之亦然#
- 4. Python將字符串轉換爲字符串,反之亦然
- 5. 轉換Unicode字符串,反之亦然
- 6. 將字符串轉換爲golang中的json,反之亦然?
- 7. 將位集合轉換爲無符號字符,反之亦然
- 8. 將字節數組轉換爲字符串,反之亦然
- 9. 將套接字轉換爲字符串,反之亦然
- 10. 將ansi轉換爲utf8,反之亦然
- 11. 將float2轉換爲double2,反之亦然
- 12. 將lonlat轉換爲xyz,反之亦然
- 13. 將NSString轉換爲NSData,反之亦然
- 14. 將HTML轉換爲Xliff,反之亦然
- 15. 將JavaUtilDate轉換爲NSDate,反之亦然?
- 16. 將RSAPrivateKey轉換爲PrivateKey,反之亦然
- 17. 將字符轉換成ASCII碼及反之亦然C++/CLI
- 18. C++轉換UTF8字符串爲十六進制,反之亦然
- 19. 在C中將UNICODE_STRING轉換爲ANSI或反之亦然
- 20. 在C#中將像素轉換爲英寸,反之亦然#
- 21. 將數組數組轉換爲字節,反之亦然C#
- 22. 如何將字符串轉換爲IP地址,反之亦然
- 23. 將紅寶石數組轉換爲字符串,反之亦然
- 24. 將音頻,mp3文件轉換爲字符串,反之亦然
- 25. 如何將字符串轉換爲Java文件,反之亦然?
- 26. Java將字符串轉換爲md5,反之亦然
- 27. 將字符串轉換爲鍵,反之亦然
- 28. 將二進制文件轉換爲字符串,反之亦然
- 29. 將字符串轉換爲位序列(反之亦然)
- 30. 如何在Linux(gcc)中將int轉換爲字符/字符串,反之亦然?
感謝您的建議。這基本上回答了我的問題。可惜沒有簡單的方法來結合這兩個函數來自動完成轉換。 –
無論如何,這樣做都是模棱兩可的行爲。如果輸入「ラーメン」(注意第一個字符是半角)作爲組合函數的輸入,是否輸出「ラーメン」(按字符轉換char),「ラーメン」(基於第一個字符的轉換)或「ラーメン「(基於多數)轉換? –
你說得很對,它變得相當複雜......我這樣做是爲了突出顯示包含日文字符的字符串中的子字符串。我想在這種情況下,涵蓋所有可能性會花費太多的處理能力,對最終用戶不太有利。我最終做了你所建議的方式,轉換爲zenkaku和hankaku,然後比較兩者,看看是否有任何事情發生,所以我可以消除漢字。謝謝您的幫助! –