Alter Mann's accepted answer, सही ढर्रे पर है, सिवाय इसके कि एक रों hould सिर्फ एक multibyte स्ट्रिंग में बाइट्स कि एक दृश्य चरित्र के लिए सांकेतिक शब्दों में बदलना नहीं है की संख्या की गणना के लिए एक कस्टम समारोह को हार्डकोड नहीं: आप स्ट्रिंग है जो नहीं है में बाइट्स की संख्या की गणना करने के लिए setlocale(LC_ALL, "")
या इसी तरह की है, और strlen(str) - mbstowcs(NULL, str, 0)
साथ कोड स्थानीय बनाना चाहिए एक दृश्य चरित्र एन्कोड करें।
setlocale()
मानक सी है (C89, C99, C11), लेकिन यह भी POSIX.1 में परिभाषित किया। mbstowcs()
मानक C99 और सी 11, और भी POSIX.1 में परिभाषित किया गया है। दोनों माइक्रोसॉफ्ट सी पुस्तकालयों में भी लागू किए गए हैं, इसलिए वे मूल रूप से हर जगह काम करते हैं।
निम्न उदाहरण कार्यक्रम, कि सी कमांड लाइन पर निर्दिष्ट स्ट्रिंग प्रिंट पर विचार करें:
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <stdio.h>
/* Counts the number of (visible) characters in a string */
static size_t ms_len(const char *const ms)
{
if (ms)
return mbstowcs(NULL, ms, 0);
else
return 0;
}
/* Number of bytes that do not generate a visible character in a string */
static size_t ms_extras(const char *const ms)
{
if (ms)
return strlen(ms) - mbstowcs(NULL, ms, 0);
else
return 0;
}
int main(int argc, char *argv[])
{
int arg;
/* Default locale */
setlocale(LC_ALL, "");
for (arg = 1; arg < argc; arg++)
printf(">%-*s< (%zu bytes; %zu chars; %zu bytes extra in wide chars)\n",
(int)(10 + ms_extras(argv[arg])), argv[arg],
strlen(argv[arg]), ms_len(argv[arg]), ms_extras(argv[arg]));
return EXIT_SUCCESS;
}
आप example
के लिए ऊपर संकलन है, और आप
./example aaa aaä aää äää aa€ a€€ €€€ a ä €
कार्यक्रम होगा उत्पादन
चलाने
>aaa < (3 bytes; 3 chars; 0 bytes extra in wide chars)
>aaä < (4 bytes; 3 chars; 1 bytes extra in wide chars)
>aää < (5 bytes; 3 chars; 2 bytes extra in wide chars)
>äää < (6 bytes; 3 chars; 3 bytes extra in wide chars)
>aa€ < (5 bytes; 3 chars; 2 bytes extra in wide chars)
>a€€ < (7 bytes; 3 chars; 4 bytes extra in wide chars)
>€€€ < (9 bytes; 3 chars; 6 bytes extra in wide chars)
>a < (1 bytes; 1 chars; 0 bytes extra in wide chars)
>ä < (2 bytes; 1 chars; 1 bytes extra in wide chars)
>€ < (3 bytes; 1 chars; 2 bytes extra in wide chars)
> < (4 bytes; 1 chars; 3 bytes extra in wide chars)
यदि अंतिम <
ऐसा करें तों अन्य लोगों के साथ नहीं मिलाया गया है क्योंकि प्रयुक्त फ़ॉन्ट सही ढंग से निश्चित-चौड़ाई नहीं है,:, इमोटिकॉन
Ä
की तरह सामान्य वर्णों से अधिक व्यापक है इतना ही है। फ़ॉन्ट को दोष दें।
अंतिम ओएस/ब्राउज़र/फ़ॉन्ट इसे प्रदर्शित नहीं कर सकता है, तो Emoticons unicode block से अंतिम चरित्र यू + 1 एफ 608 स्माइलिंग फेस है। लिनक्स में, सभी उपरोक्त >
और <
कंसोल (गैर-ग्राफिकल सिस्टम कंसोल) समेत सभी टर्मिनल में सही ढंग से लाइन अप करते हैं, हालांकि कंसोल फ़ॉन्ट में इमोटिकॉन के लिए ग्लिफ नहीं है, और इसके बजाय बस इसे एक हीरा।
Alter Mann's answer के विपरीत, यह दृष्टिकोण पोर्टेबल है, और इस बारे में कोई धारणा नहीं है कि वर्तमान उपयोगकर्ता द्वारा वास्तव में कौन सा चरित्र सेट उपयोग किया जाता है।
क्या आप यूटीएफ -8 एन्कोडिंग का उपयोग कर रहे हैं? उन पात्रों को 2 बाइट की आवश्यकता होती है, और 'printf' यूटीएफ -8 को अवगत नहीं हो सकता है। – user694733
http://stackoverflow.com/questions/15528359/printing-utf-8-strings-with-printf-wide-vs-multibyte-string-literals – 123
@ user694733 हां, मैं utf-8 –