5

我有一个要在标签中显示的 UTF-8 编码字符串。

当我设置断点并检查保存字符串的变量时,一切看起来都很好。但是,当我尝试输出到日志或标签时,我得到了拉丁编码。

Xcode 截图

我已经尝试了几乎所有关于 SO 及其他方面的建议,但我就是无法让字符串正确显示。

这是我的代码:

NSString *rawString = [NSString stringWithFormat:@"%@",m_value];

const char *utf8String = [rawString UTF8String];
NSLog (@"%@", [NSString stringWithUTF8String:utf8String]);
NSLog (@"%s", utf8String);
NSLog (@"%@", rawString);

self.resultText.text = [NSString stringWithUTF8String:utf8String];

m_value 是一个 NSString,并且在调试窗口中,它也显示了正确的编码。

m_value NSString *  0x006797b0 @"鄧樂愚..."
    NSObject    NSObject    
    isa Class   0x3bddd8f4
    [0] Class   

我正在使用 iOS 6.1 SDK。

4

4 回答 4

4

好的,如果m_value是 const char 包含 UTF-8 字符串,则必须使用此方法:

- (id)initWithUTF8String:(const char *)bytes

NSString *correctString = [[NSString alloc] initWithUTF8String: m_value];

传递const char*@格式化程序是不正确的,因为@意味着NSObject, 所以它总是不正确的并且可能导致应用程序崩溃

于 2013-04-04T10:25:56.153 回答
4

当我想在标签上显示高棉时,我使用字体“Hanuman.ttf”。这是我使用的代码:

`UIFont *font = [UIFont fontWithName:@"Hanuman" size:20.0f];

self.nameLabel.text = [NSString stringWithFormat:@"%@",itemName];
self.nameLabel.font = font;`

设置字体

结果

我不知道这对你有没有帮助,但这是我以前做过的!

于 2013-04-05T03:43:28.447 回答
3

所以我终于设法弄清了这个问题。

m_value NSString是由我无法访问源代码的第三方库设置的。即使这个变量的值在调试面板(即显示汉字)中被正确解码,字符串实际上是用NSMacOSRomanStringEncoding.

我能够通过将输出复制到TextWrangler并翻转编码来确定这一点,直到找到正确转换为 UTF-8 的编码。

然后在 Objective-C 中修复,我首先将其翻译NSStringconst char

const char *macString = [bxr.m_value cStringUsingEncoding:NSMacOSRomanStringEncoding];

然后转换回NSString

NSString *utf8String = [[NSString alloc]initWithCString:macString encoding:NSUTF8StringEncoding];

+1 给@Vitaly_S 和@iphonic,他们的回答最终让我找到了这个解决方案。对于其他偶然发现这一点的人;似乎从 Xcode 4.6.1 开始,不能信任调试窗口来正确呈现字符串,但您可以依赖NSLog输出。

于 2013-04-04T15:44:03.183 回答
1

考虑到您的变量m_value NSData,您可以尝试以下操作

self.resultText.text = [[NSString alloc] initWithData:m_value encoding:NSISOLatin1StringEncoding]; 

有很多可用的编码,你也可以试试

NSASCIIStringEncoding       /* 0..127 only */
NSNEXTSTEPStringEncoding
NSJapaneseEUCStringEncoding
NSUTF8StringEncoding
NSISOLatin1StringEncoding
NSSymbolStringEncoding
NSNonLossyASCIIStringEncoding
NSShiftJISStringEncoding          /* kCFStringEncodingDOSJapanese */
NSISOLatin2StringEncoding
NSUnicodeStringEncoding
NSWindowsCP1251StringEncoding    /* Cyrillic; same as AdobeStandardCyrillic */
NSWindowsCP1252StringEncoding    /* WinLatin1 */
NSWindowsCP1253StringEncoding    /* Greek */
NSWindowsCP1254StringEncoding    /* Turkish */
NSWindowsCP1250StringEncoding   /* WinLatin2 */
NSISO2022JPStringEncoding        /* ISO 2022 Japanese encoding for e-mail */
NSMacOSRomanStringEncoding

NSUTF16StringEncoding      /* An alias for NSUnicodeStringEncoding */

NSUTF16BigEndianStringEncoding          /* NSUTF16StringEncoding encoding with explicit endianness specified */
NSUTF16LittleEndianStringEncoding      /* NSUTF16StringEncoding encoding with explicit endianness specified */

NSUTF32StringEncoding                  
NSUTF32BigEndianStringEncoding          /* NSUTF32StringEncoding encoding with explicit endianness specified */
NSUTF32LittleEndianStringEncoding        /* NSUTF32StringEncoding encoding with explicit endianness specified */
于 2013-04-04T10:21:14.933 回答