2013-09-26 4 views
5

अभी मैं अपने सी प्रोग्राम में libunistring का उपयोग करने की कोशिश कर रहा हूँ। मुझे यूटीएफ -8 स्ट्रिंग को संसाधित करना है, और इसके लिए मैंने libunistring लाइब्रेरी से u8_strlen() फ़ंक्शन का उपयोग किया है।
कोड उदाहरण:libunistring u8_strlen() strlen() के बराबर है?

void print_length(uint8_t *msg) { 
    printf("Default strlen: %d\n", strlen((char *)msg)); 
    printf("U8 strlen: %d\n", u8_strlen(msg)); 
} 

जरा कल्पना है कि हम फोन print_length()msg = "привет" साथ (सिरिलिक, UTF-8 एन्कोडिंग)। मुझे उम्मीद है कि strlen() 12 (6 अक्षर * 2 बाइट प्रति अक्षर), और u8_strlen() वापस 6 (केवल 6 अक्षरों) लौटाएगा।

लेकिन मैं प्राप्त उत्सुक परिणाम:

Default strlen: 12 
U8 strlen: 12 

इस के बाद मैं देखने के लिए u8_strlen प्राप्ति की कोशिश की कर रहा हूँ, और इस कोड मिला:,

size_t 
u8_strlen (const uint8_t *s) 
{ 
    return strlen ((const char *) s); 
} 

मैं सोच रहा हूँ है यह बग या यह सही जवाब है? यदि यह सही है, क्यों?

उत्तर

7

मुझे विश्वास है कि यह इरादा व्यवहार है।

size_t u8_strlen (स्थिरांक uint8_t * रों)

रिटर्न रों में पुस्तकों की संख्या:

The libunistring manual कि कहते हैं।

इसके अलावा मैनुअल में, यह परिभाषित करता है क्या यह "इकाई" है:

UTF-8 तार, प्रकार 'uint8_t *' के माध्यम से। इकाइयां बाइट्स हैं (uint8_t)।

मेरा मानना ​​है कि कारण वे समारोह u8_strlen भले ही यह होता है मानक strlen से ज्यादा कुछ नहीं पुस्तकालय भी u16_strlen और u32_strlen UTF-16 और UTF-32 तार, क्रमशः पर कार्रवाई की है कि लेबल (जो होगा 0x0000 तक 2-बाइट इकाइयों की संख्या और 4-बाइट इकाइयों को 0x00000000 तक गिनें), और उन्होंने पूर्णता के लिए u8_strlen शामिल किया।

GNU gnulib तथापि शामिल mbslen जो शायद आप क्या चाहते हैं करता है:

mbslen समारोह: एक स्ट्रिंग में multibyte वर्णों की संख्या निर्धारित करें।

0

बेरी के उत्तर के अलावा, मुझे लगता है कि सी मानक एक चार में 8 बिट से अधिक होने की अनुमति देता है। फिर strlen() लंबाई में लंबाई लौटाएगा, न कि 8-बिट ब्लॉक में, तो u8_strlen() रिटर्न (या वापस लौटना चाहिए - जो कार्यान्वयन आपने दिखाया है वह स्पष्ट रूप से काम नहीं करेगा और strlen() के समान उत्तर देगा) ।

संबंधित मुद्दे