2011-06-22 24 views
6

ヘッダ行にあるように、私は全角文字をC#のhankakuとvice-vrsaに変換したいと思いますが、その方法を理解することはできません。だから、「ラーメン」を「ラーメン」と言います。 これは、入力のフォーマットに基づいて、変換をどのように行う必要があるかを自動的に判断する方法で記述できますか?C#の全角文字を半角と半角に変換する

答えて

2

あなたががmicrosoft.visualbasic.dllへの参照を含めることによって、Strings.StrConv()メソッドを使用するかは、p/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(); 
} 

入力文字列のフォーマットを検出するには、まず変換を行い、結果を比較することなく簡単な方法を認識していません。 (文字列に全角と半角の両方の文字が含まれている場合はどうなりますか)

+0

提案していただきありがとうございます。これは基本的に私の質問に答えます。残念ながら、2つの機能を組み合わせて自動的に変換を行う簡単な方法はありません。 –

+0

これを行うと、とにかくあいまいな動作になります。私が "ラーメン"(最初の文字が半角であることに注意してください)を結合した関数の入力として与えると、 "ラーメン"(char-by-char)、 "ラーメン"(最初の文字に基づいて変換)、または "ラーメン "(多数回答) –

+0

あなたは大丈夫です、かなり複雑です...私は日本語の文字を含む文字列の部分文字列を強調表示するためにこれをやっています。このケースでは、すべての可能性をカバーすることは、あまり多くの処理能力を必要とせず、エンドユーザにとってあまり有益ではないと思います。私はあなたが途中で提案したことをやってしまい、全角とハンカクに変換して、両者を比較して何かが起こったかどうかを見て、漢字を取り除くことができます。助けてくれてありがとう! –

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" 

Unicode Chart: Halfwidth and Fullwidth Forms (FF00-FFEF)

+0

ありがとうございます。私は文字列でこのようなことを考えました。すべての文字を含む配列と配列を持っていましたが、時間がかかると思っています。辞書がきれいに見えるので、私はこれを行かせるかもしれない。 –

+0

ちょうど言っている:提案に非常に感謝します。私はアプローチが気に入っていますが、達成しようとしていたことはあまりにも複雑でした。私がこれを持っている潜在的な問題の1つは、事前に辞書を作成する必要があることです。VBがStrConv()メソッドを持っているときに、これを純粋なC#で行う唯一の方法でなければならないというのは奇妙なことです。 –