2009-04-06 19 views
12

NSLog: kodlarının ilk satırında Aşağıdaki kod ile bir sorun var yanlış kodlama

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

, iki Çince karakterler alıntılanan çift bulunmaktadır. Sorun printf işlevi Çince karakterleri düzgün görüntüleyebilir, ancak NSLog yapamaz.
Herkese teşekkürler. Bu problem için bir çözüm buldum. Foundation, UTF-16'yı varsayılan olarak kullanır, bu nedenle örnekte c dizgisini çıkarmak için NSLog'u kullanmak için, UTF-16 c dizesini almak için cStringUsingEncoding kullanmalı ve% S'yi değiştirmek için% S kullanmalısınız.

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

cevap

2

Neler olup bittiğini anlamanıza yardımcı olacak bir cevap aradığınızı biliyorum.

Ama bu şu anda sorunu çözmek için yapabileceği budur:

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

Benim tahminim NSLog UTF-8 dışında 8 bit C-dizeleri için farklı bir kodlama varsayar olduğunu ve olabileceğini Çince karakterleri desteklemeyen biri. Olduğu gibi Garip, bunu deneyebilirsiniz:

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

NSLog en% s biçim belirteci, her zaman MacRoman değil unicode gibi görünüyor sistem kodlama, içinde, yani söz konusu MacRoman kodlamada sadece gösterge karakterleri can. NSLog ile en iyi seçeneğiniz,% @ yerli nesne formatı belirtecini kullanmak ve NSString'i doğrudan bir C String'e dönüştürmek için kullanmaktır. Yalnızca bir C dizginiz varsa ve printf veya asl yerine bir ileti görüntülemek için NSLog kullanmak istiyorsanız, önce dizeyi bir NSString nesnesine dönüştürmek için Don'un önerdiği gibi bir şey yapmanız gerekecektir.

Yani, tüm bunlar beklenen dize göstermesi gerekir: notu, asl kullanmaya karar verirseniz

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

o UTF8 formatında dizeleri kabul eder ve böylece (Syslog'un için doğru kodlamayı geçerken konsolda düzgün bir şekilde görünecektir), terminale görüntülendiğinde veya bir dosya tanıtıcısına giriş yaparken görsel kodlama için dizeyi kodlar, böylece ASCII olmayan değerler kaçan karakter dizileri olarak görüntülenir.

-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

İyi bir yaklaşım :-) '#' ve 'define' arasındaki boşluklarla çalışacak mı? Ayrıca, kod satırı çok uzun olduğu ve bu nedenle iyi okunabilir olmadığı için belki de bir açıklama satırı yardımcı olabilir. –

+0

@peter_the_oak Benim için mükemmel çalış – Gank

İlgili konular