2013-01-24 23 views
5

मैं सी # में एक StringBuilder उपयोग कर रहा हूँ कुछ पाठ, जो अंग्रेजी हो सकता है संलग्न करने के लिए (बाएं से दाएं) या अरबी (दाएं से बाएं)दाएं से बाएं करने के लिए भाषा ब्रैकेट उलट

stringBuilder.Append("("); 
stringBuilder.Append(text); 
stringBuilder.Append(") "); 
stringBuilder.Append(text); 

तो पाठ = 'ए' , तो उत्पादन "(ए) ए 'है

लेकिन अगर पाठ =" بتث ", तो उत्पादन" (بتث) بتث "

कोई भी विचार है?

+2

99.9 99% यह कोड गलती नहीं है बल्कि आप जो भी आउटपुट चुनते हैं। आप इस आउटपुट को कहां देखते हैं? यूआई के लिए दोनों दिशाओं का समर्थन करने के लिए यह बहुत जटिल है, इस दिन तक जीमेल में भी बड़ी समस्याएं हैं। –

उत्तर

7

यह राइट-टू-बाएं टेक्स्ट, अरबी या हिब्रू प्रस्तुत करने के लिए कहा जाने पर विंडोज टेक्स्ट रेंडरिंग इंजन में एक प्रसिद्ध दोष है। इसे सुलझाने में एक मुश्किल समस्या है, जब लोग भाषा में कोई अच्छा वैकल्पिक शब्द उपलब्ध नहीं होते हैं तो लोग अक्सर पश्चिमी शब्दों और विराम चिह्न में वापस आते हैं। उदाहरण के लिए ब्रांड और कंपनी के नाम। प्रस्तुतकर्ता कोड बिंदुओं को देखकर उचित रेंडर ऑर्डर पर अनुमान लगाने का प्रयास करता है, लैटिन चरित्र में वर्णों के साथ स्पष्ट रूप से बाएं से दाएं प्रस्तुत किया जाता है।

लेकिन यह विराम चिह्न पर फंसे हुए हैं, ब्रैकेट सबसे अधिक दिखाई देने वाले हैं। आपको इसके बारे में स्पष्ट होना चाहिए ताकि यह पता चल सके कि क्या करना है, आपको सी # कोड में यूनिकोड राइट-टू-बाएं मार्क, U+200F या \u200f का उपयोग करना होगा। इसके विपरीत, यदि आपको पता है कि आपको एलटीआर प्रतिपादन, U+200E की आवश्यकता है, तो बाएं से दाएं चिह्न का उपयोग करें।

+0

बंद होने के बाद दाएं से बाएं डालने से यह विशेष आउटपुट समस्या हल हो जाएगी, लेकिन यदि आप कर सकते हैं, तो आपको अपने नियंत्रण में सही दिशा मूल्य लागू करना होगा। –

+0

मैंने कोशिश की और यह काम करता है। धन्यवाद! – daniely

0

उपयोग AppendFormat के बजाय सिर्फ Append:

stringBuilder.AppendFormat("({0}) {0}", text) 

यह समस्या का समाधान हो, लेकिन यह हो सकता है - आप text मूल्य को देखने के लिए की जरूरत है - यह शायद लीटर/RTL मार्करों पात्रों एम्बेडेड गया है। इन्हें या तो मूल्य में हटाया या सही किया जाना चाहिए।

+0

आपके उत्तर का उत्तरार्द्ध हिस्सा (एलटीआर/आरटीएल मार्कर) के बारे में सच है, यह है कि यदि 'AppendFormat' अनिवार्य रूप से' संलग्न है (string.Format ("{0}", टेक्स्ट)) '(मैंने परीक्षण किया है' स्ट्रिंग। प्रारूप ("")) ' – LukeHennerley

+0

@LukeHennerley - यह अनिवार्य रूप से यह है - ओपी के रूप में कई जोड़ों की तुलना में बस अधिक सुविधाजनक है। – Oded

0

मेरे पास एक समान समस्या थी और मैंने एक ऐसा फ़ंक्शन बनाकर इसे हल करने में कामयाब रहा जो यूनिकोड में प्रत्येक चार को जांचता है। यदि यह पृष्ठ एफई से है तो मैं नीचे दिखाए गए अनुसार इसके बाद 202C जोड़ता हूं। इसके बिना मैं जो चाहता था उसके लिए आरटीएल और एलटीएफ मिश्रित हो जाता है।

string us = string.Format("\uFE9E\u202C\uFE98\u202C\uFEB8\u202C\uFEC6\u202C\uFEEB\u202C\u0020\u0660\u0662\u0664\u0668 Aa1");