o başlık satırında söylediği gibi içinde hankaku karakter ve tersi Zenkaku dönüştürme, C# olanları ve yardımcısı VRSA hankaku için Zenkaku karakterleri dönüştürmek istiyor ancak bunu nasıl anlamaya olamaz. Yani "ラ ー メ ン" ifadesini "ラ ー メ ン" ve diğer yollardan söyleyin. Bunu, girişin biçimine göre dönüşümün hangi yöne gitmesi gerektiğini otomatik olarak belirleyen bir yöntemle yazmak mümkün olabilir mi?C#
C#
cevap
için Microsoft.VisualBasic.dll başvuru içerecek Strings.StrConv() yöntemi kullanabilir veya s/LCMapString() doğal fonksiyonu çağırmak için:
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);
ve olabildiğince ayrıca tersini de yapın:
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();
}
Giriş dizgisinin formatını tespit etmek için, önce bir dönüşüm yapmadan ve sonuçları karşılaştırmadan kolay bir yoldan haberdar değilim. Öneriniz için
Bir yaklaşım birbirlerine haritasına tüm dönüştürmek istediğiniz karakterleri ve nasıl bir listesini derlemek ve sonra giriş dizesi yineleme ve kendi eşdeğer listedeki tüm karakterleri değiştirmektir.
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"
Teşekkürler (dize tam genişlik ve yarı genişlikli karakterler? hem içindekiler ise). Böyle bir şeyi bir string ile düşündüm. Tüm karakterleri içeren diziler ve diziler, ama alacağı süreyi merak ediyorum. Bir sözlük daha iyi görünüyor, bu yüzden bunu bir adım atabilirim. –
Sadece söylemek gerekirse: öneri için çok teşekkürler. Yaklaşımı severim, ama elde etmeye çalıştığım şey için fazlasıyla karmaşıktı. Ayrıca Bununla var bir potansiyel sorun bu VB StrConv() yöntemini sahip olduğunda saf C# bunu yapmanın tek yolu olması gerektiğini Biraz garip önceden sözlükleri oluşturmak için ihtiyaç ... olduğunu. –
Öneriniz için teşekkürler. Bu temelde sorumu cevaplıyor. Dönüşümü otomatik olarak yapmak için iki işlevi birleştirmenin kolay bir yolu olmadığını üzücü. –
Böyle yapmak muğlak bir davranış olacak zaten. Ben verirsen "ラ ー メ ン" yapın kombine fonksiyona girdi olarak (yarı genişlikte olan ilk kömürü dikkat edin) çıkış "ラ ー メ ン" (Char-by-Char dönüştürmek), "ラ ー メ ン", (ilk karakter dayalı dönüştürmek) veya "ラ ー メ ン "(çoğunluğa dayalı dönüştürmek)? –
Oldukça haklısınız, oldukça karmaşıklaşıyor ... Bunu, Japonca karakterler içeren bir dizede alt dizeleri vurgulamak için yapıyorum. Bu durumda tüm olasılıkları kapsayan son kullanıcı için çok fazla yarar sağlamadığı için çok fazla işlem gücü alacağını tahmin ediyorum. Bu arada, zenkaku ve hankaku'ya dönüp, bir şey olup olmadığını görmek için her ikisini de karşılaştırdığın şeyi yaptım, böylece kanji'yi yok edebilirim. Yardım için teşekkürler! –