2013-02-27 101 views
6

में पूर्ण चौड़ाई या अर्धविड्थ है या नहीं, मैं एक टर्मिनल (कंसोल) एप्लिकेशन लिख रहा हूं जो मनमाने ढंग से यूनिकोड टेक्स्ट को लपेटने वाला है।यह निर्धारित करता है कि एक यूनिकोड कैरेक्टर सी ++

टर्मिनलों आमतौर पर एक मोनोस्पेस्ड (निश्चित चौड़ाई) फ़ॉन्ट का उपयोग कर रहे हैं, इसलिए एक पाठ को लपेटने के लिए, यह वर्णों की गिनती करने और यह देखने के लिए मुश्किल से अधिक है कि कोई शब्द किसी पंक्ति में फिट हो या नहीं और उसके अनुसार कार्य करें।

समस्या यह है कि यूनिकोड तालिका में पूर्णदर्शी वर्ण हैं जो टर्मिनल में 2 वर्णों की चौड़ाई लेते हैं।

इन्हें गिनने से 1 यूनिकोड चरित्र दिखाई देगा, लेकिन मुद्रित चरित्र 2 "सामान्य" (अर्धविड्थ) वर्ण चौड़ा है, रैपिंग दिनचर्या तोड़ रहा है क्योंकि यह चौड़ाई को दो बार लेने वाले वर्णों से अवगत नहीं है।

उदाहरण के लिए, यह एक पूर्ण-चौड़ाई चरित्र (U + 3004, JIS प्रतीक)

 
〄 
12 

यह यहां 2 पात्रों की पूरी चौड़ाई नहीं ले करता है, हालांकि यह पूर्वस्वरूपित है, लेकिन यह दो बार का उपयोग करता है एक टर्मिनल में एक पश्चिमी चरित्र की चौड़ाई।

इससे निपटने के लिए, मुझे पूर्ण चौड़ाई या अर्धविड्थ पात्रों के बीच अंतर करना होगा, लेकिन मुझे C++ में ऐसा करने का कोई तरीका नहीं मिल रहा है। क्या समस्या के आसपास आने के लिए यूनिकोड टेबल में सभी फ़ुलविड्थ वर्णों को जानना वाकई आवश्यक है?

+1

प्रासंगिक http://www.icu-project.org/apiref/icu4c/uchar_8h.html#a3376f0d34bb23c54671859f1978b4226 और http://www.unicode.org/reports/tr11/ –

+0

किस ओएस/प्लेटफ़ॉर्म के लिए? –

+0

क्षमा करें मुझे याद आया। ओएस लिनक्स है। – Noice

उत्तर

6

आपको UCHAR_EAST_ASIAN_WIDTH संपत्ति के साथ आईसीयू u_getIntPropertyValue का उपयोग करना चाहिए।

उदाहरण के लिए:

bool is_fullwidth(UChar32 c) { 
    int width = u_getIntPropertyValue(c, UCHAR_EAST_ASIAN_WIDTH); 
    return width == U_EA_FULLWIDTH || width == U_EA_WIDE; 
} 

ध्यान रखें कि आपके ग्राफिक्स पुस्तकालय तो अक्षरों के संयोजन का समर्थन करता है, तो आप जब एक दृश्य का उपयोग करता है कि कितने कोशिकाओं का निर्धारण करने के लिए उन पर विचार करने के साथ ही होगा; उदाहरण के लिए eU+0301 के बाद COMBINING ACUTE ACCENT केवल 1 सेल लेगा।

+0

मैं निर्भरताओं को कम करने के लिए अभी सभी आईसीयू को सभी कॉलों को प्रतिस्थापित करने जा रहा हूं। शायद मैं u_getIntPropertyValue विधि की सहायता से सभी फुलविड्थ वर्णों की एक तालिका बना सकता हूं। संयोजन पात्रों के संकेत के लिए धन्यवाद। मैं जांच करूंगा कि यह टर्मिनल पर भी लागू होता है या नहीं। – Noice

+0

@Noice यह अब आपके लिए प्रासंगिक नहीं हो सकता है, लेकिन मैंने हाल ही में एक समान प्रश्न के लिए वर्ण श्रृंखला को एक साथ रखा है, यहां: http://stackoverflow.com/a/15651264/777186 – jogojapan

2

तालिका का निर्माण करने के लिए कोई ज़रूरत नहीं है, यूनिकोड से लोग पहले से ही किया है कि:

http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c

एक ही कोड टर्मिनल नकल सॉफ्टवेयर जैसे xterm[1], konsole[2] और काफी संभावना अन्य लोगों में प्रयोग किया जाता है ..