2011-06-22 8 views
6

में इसके विपरीत, जैसा कि यह हेडर लाइन में कहता है, मैं ज़ेनकाकू पात्रों को हांककू और कन्वर्स में सी # में परिवर्तित करना चाहता हूं, लेकिन यह नहीं समझ सकता कि इसे कैसे किया जाए। तो, "ラ ー メ ン" से "ラ ー メ ン" और दूसरी तरफ कहें। क्या यह एक विधि में लिखना संभव होगा जो इनपुट के प्रारूप के आधार पर रूपांतरण को किस तरह से जाना है, स्वचालित रूप से निर्धारित करता है?जेनकाकू पात्रों को हांककू में परिवर्तित करना और सी #

उत्तर

2

आप Microsoft.VisualBasic.dll के लिए एक संदर्भ शामिल करके Strings.StrConv() विधि का उपयोग कर सकते हैं, या आप पी/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

सुझाव के लिए धन्यवाद। यह मूल रूप से मेरे प्रश्न का उत्तर देता है। एक दयालुता कि रूपांतरण को स्वचालित रूप से करने के लिए दो कार्यों को गठबंधन करने का कोई आसान तरीका नहीं है। –

+0

ऐसा करने से वैसे भी संदिग्ध व्यवहार होगा। यदि मैं आपके संयुक्त समारोह में इनपुट के रूप में "ラ ー メ ン" (नोट पहले चार अर्द्ध चौड़ाई) देता हूं, तो क्या आप आउटपुट करते हैं "ラ ー メ ン" (चार-दर-चार रूपांतरित करें), "ラ ー メ ン" (पहले चार पर आधारित रूपांतरित करें), या "ラ ー メ ン "(बहुमत के आधार पर कनवर्ट करें)? –

+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

बस कहने के लिए: सुझाव के लिए बहुत बहुत धन्यवाद। मुझे दृष्टिकोण पसंद है, लेकिन मैं जो हासिल करने की कोशिश कर रहा था उसके लिए यह काफी जटिल था। इसके साथ ही मेरे पास एक संभावित समस्या है जो शब्दकोशों को पहले से बनाने की ज़रूरत है ... थोड़ा अजीब बात यह है कि यह शुद्ध सी # में ऐसा करने का एकमात्र तरीका होना चाहिए जब वीबी में स्ट्रोकोन() विधि हो। –