2009-04-06 8 views
12

मैं निम्नलिखित कोड के साथ एक समस्या है:NSLog गलत एन्कोडिंग

NSString *[email protected]"你好"; 
char temp[200]; 
strcpy(temp, [strValue UTF8String]); 
printf("%s", temp); 
NSLog(@"%s", temp); 
कोड की पहली पंक्ति में

, दो चीनी अक्षरों डबल उद्धृत कर रहे हैं। समस्या यह है कि printf फ़ंक्शन चीनी वर्णों को ठीक से प्रदर्शित कर सकता है, लेकिन NSLog नहीं कर सकता है।


सभी के लिए धन्यवाद। मैंने इस समस्या के लिए एक समाधान निकाला। फाउंडेशन डिफ़ॉल्ट रूप से यूटीएफ -16 का उपयोग करता है, इसलिए उदाहरण में सी स्ट्रिंग को आउटपुट करने के लिए एनएसएलओजी का उपयोग करने के लिए, मुझे यूटीएफ -16 सी स्ट्रिंग प्राप्त करने के लिए cStringUsingEncoding का उपयोग करना होगा और% s को प्रतिस्थापित करने के लिए% S का उपयोग करना होगा।

NSString *[email protected]"你好"; 
char temp[200]; 
strcpy(temp, [strValue UTF8String]); 
printf("%s", temp); 
strcpy(temp, [strValue cStringUsingEncoding:NSUTF16LittleEndianStringEncoding]); 
NSLog(@"%S", temp); 

उत्तर

2

मुझे पता है कि आप शायद एक उत्तर ढूंढ रहे हैं जो आपको समझने में मदद करेगा कि क्या हो रहा है।

लेकिन यह आप अभी अपनी समस्या को हल करने के लिए क्या कर सकते हैं यह है:

NSLog(@"%@", strValue); 
4

मेरा अनुमान है कि NSLog UTF-8 से 8 बिट सी तार के लिए एक अलग एन्कोडिंग मान लिया गया है, और यह हो सकता है एक जो चीनी पात्रों का समर्थन नहीं करता है। अजीब बात है के रूप में, तो आप इस कोशिश कर सकते हैं:

NSLog(@"%@", [NSString stringWithCString: temp encoding: NSUTF8StringEncoding]); 
10

NSLog के% s फॉर्मेट स्पेसिफायर, प्रणाली एन्कोडिंग है, जो हमेशा MacRoman और नहीं यूनिकोड हो रहा है में है, इसलिए यह MacRoman एन्कोडिंग में केवल प्रदर्शन वर्ण कर सकते हैं। एनएसएलओजी के साथ आपका सबसे अच्छा विकल्प सिर्फ मूल ऑब्जेक्ट प्रारूप विनिर्देश% @ का उपयोग करना है और इसे सीएस स्ट्रिंग में परिवर्तित करने के बजाय सीधे एनएसएसटींग पास करना है। यदि आपके पास केवल सी स्ट्रिंग है और आप printf या asl के बजाय संदेश प्रदर्शित करने के लिए NSLog का उपयोग करना चाहते हैं, तो आपको स्ट्रिंग को एनएसएसटींग ऑब्जेक्ट में पहले कनवर्ट करने के लिए डॉन सुझावों की तरह कुछ करना होगा।

तो, इन सब की उम्मीद स्ट्रिंग प्रदर्शित करना चाहिए:

NSString *str = @"你好"; 
const char *cstr = [str UTF8String]; 
NSLog(@"%@", str); 
printf("%s\n", cstr); 
NSLog(@"%@", [NSString stringWithUTF8String:cstr]); 

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

-1
# define NSLogUTF8(a,b) NSLog(a,[NSString stringWithCString:[[NSString stringWithFormat:@"%@",b] cStringUsingEncoding:NSUTF8StringEncoding] encoding:NSNonLossyASCIIStringEncoding]) 

#define NSLogUTF8Ex(a,b) NSLog(a,[MLTool utf8toNString:[NSString stringWithFormat:@"%@",b]]) 

+(NSString*)utf8toNString:(NSString*)str{ 
    NSString* strT= [str stringByReplacingOccurrencesOfString:@"\\U" withString:@"\\u"]; 
    //NSString *strT = [strTemp mutableCopy]; 
    CFStringRef transform = CFSTR("Any-Hex/Java"); 
    CFStringTransform((__bridge CFMutableStringRef)strT, NULL, transform, YES); 

    return strT; 
} 
+0

अच्छा दृष्टिकोण :-) क्या यह '#' और 'परिभाषित 'के बीच रिक्त स्थान के साथ काम करेगा? साथ ही, स्पष्टीकरण की एक पंक्ति सहायक हो सकती है, क्योंकि कोड लाइन बहुत लंबी है और इस प्रकार अच्छी पठनीय नहीं है। –

+0

@peter_the_oak मेरे लिए सही काम करें – Gank

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