当在iPhone上进行调试时,NSLog会将Unicode字符输出为垃圾字符。

16

编辑: 在模拟器中,NSLog输出正常,但连接到真实设备时不起作用。看起来这是一个错误 - http://openradar.appspot.com/11148883。同时,这似乎与LLDB有关。将Xcode切换到GDB可以解决问题。或者可以尝试JetBrain的AppCode,它可以很好地与LLDB一起使用。


我在应用程序中有一堆Unicode字符串,如果我尝试使用类似NSLog(@“%@”,aString)的东西输出任何这些字符串,那么字符串中的所有ASCII字符都会被正确打印,但所有的西里尔字母都会混乱,所以不能正常显示。

newLocation: coordinate:60.019584,30.284954 'Удельная'

我得到了:

newLocation: coordinate:60.019584,30.284954 '–ü–æ–∫–ª–æ–Ω–Ω–æ–≥–æ—Ä—Å–∫–∞—è'

那样的输出结果很难进行任何调试。而且由于该应用程序仅面向俄罗斯市场,我无法只更改语言环境并使用英文字符串。

所以我想知道是否有办法让NSLog能够很好地处理Unicode字符?我只在寻找某种一行代码解决方案,我知道有一些方法可以编写半页代码并输出Unicode字符,但我正在寻找更短的方式。理想情况下,我正在寻找一些可以使所有内容正常工作的NSString方法,例如:

NSLog(@"%@", [aString someThingThatMakesUnicodeWorkWithXcodeConsole]);

1
你确定你的aString正确地存储了响应吗?从你发布的内容来看,我认为aString没有正确地存储响应,所以当你用NSLog打印它时会失败。我经常用NSLog打印希腊字符。你是如何将响应存储到aString中的? - Lefteris
1
这些字符串是从哪里来的?是从文件中读取的吗?当它们在代码内部时应该可以工作。我测试了:NSString *s = @"Удельная"; NSLog(@"%@", s); 它运行良好。 - Kai Huppmann
这些数据来自文件,但字符串字面量对我也没有起作用。但似乎我已经找到了问题的源头——在模拟器中它运行良好,但连接到 iPhone 时输出垃圾数据,所以可能是某些设置出了问题。谢谢。 - Dmitry Sokurenko
5个回答

4

当然,你可以创建一个包含并输出西里尔字母的字符串。当我学习Objective-C时,一开始我也遇到了同样的问题(我也在处理俄语单词之类的东西)。解决方法是将字符串转换为其他格式,如下所示:

NSString *string = [NSString stringWithCString:"Привет, как дела?" encoding:4];
NSLog(@"%@", string);

或者

NSString *string = [NSString stringWithUTF8String:"Этот вариант короче!"];
NSLog(@"%@", string);

希望这能帮到你!

顺便说一下,这意味着你需要将你的字符串创建为C风格的字符串,并将它们的编码参数设置为4(UTF-8)。你可以在NSString中的NSStringEncoding文档中查看所有可用参数的列表。


谢谢回复,但是情况是,在模拟器中俄语字符串默认工作正常,包括你提出的所有解决方案都可以使用。但是当我将Xcode连接到真实设备时,这些西里尔字母被输出为垃圾字符。 - Dmitry Sokurenko
@dsokurenko 很抱歉我无法检查此问题。您的设备本地化情况如何?我真的不知道问题出在哪里,但我会尝试找出来。 - Anatoliy Gatt
@dsokurenko 一切都应该正确显示,因为字符串采用正确的编码(UTF-8 是唯一一个能够正确处理 Cyrillic 的编码)。 - Anatoliy Gatt

3
据我所知,这与某些Xcode版本上的NSLog()和LLDB有关。您可以尝试以下解决方案:
  • 在Xcode组织器(Organizer)>> 设备(Devices)>> 您的设备(your device)>> 控制台(Console)中检查日志。
  • 如果您正在使用LLDB,请将调试器更改为GDB。这可以从模式选项中更改。请参阅下面"cocos2d man"的评论中的步骤。
  • 升级到Xcode 4.3.2。有人说这解决了此问题,但我自己还没有确认。

谢谢,实际上切换到GDB解决了问题。切换到4.3.2不会有帮助,因为我已经在使用它了。 - Dmitry Sokurenko
无论如何,这是正确的解决方案,但我在组织者中找不到这个选项,在新的Xcode中长时间搜索后,我发现我们可以使用以下步骤从模式更改调试器: 1-单击当前模式旁边的当前模式(它位于停止和播放按钮旁边,以及像iphone-simulator ...这样的测试当前模式) 2-选择“编辑模式”选项 3-打开“信息”选项卡 4-转到第三个名为“调试器”的下拉列表 5-将值从LLDB更改为GDB关闭窗口并再次构建和运行 :) - Adel
@cocos2dman 很抱歉误解了……上面的1、2、3是三个解决方案,而不是一个解决方案的3个步骤。我会用项目符号来替换这些数字。 - Hailei
@ Halley,很好,我发现你说的是正确的,但是我找不到你所提到的方法,所以我写了我写的内容 :) - Adel

1
尝试将其转换为UTF8字符串。
NSString *str = [aString UTF8String]
 NSLog(@"%@", str);

希望这对你有所帮助。

不好意思,它无法修复输出。 - Dmitry Sokurenko
确保在nslog中需要放置@符号。 - Ranga
4
实际上,@"%@" 根本不起作用,因为 UTFString 的输出是一个 C 字符串,并且使用正确的 "%s" 格式化字符串时,它将输出与原始字符串相同的垃圾内容。 - Dmitry Sokurenko

0

试试这个。对我来说有效。

NSLog(@"%@", [NSString stringWithCString:[[places description] cStringUsingEncoding:NSASCIIStringEncoding] encoding:NSNonLossyASCIIStringEncoding]);

0

尝试这样写:NSLog(@"%@", aString);

编辑:

你可以将其转换为UTF8字符串。这可能会帮助你解决问题。

NSString *str = [aString UTF8String];

希望这能有所帮助。

当然我做了,只是在问题中打错了,不管怎样还是谢谢。 - Dmitry Sokurenko
我看过了,但不幸的是它并没有起到作用,它仍然输出无意义的垃圾。 - Dmitry Sokurenko
"-UTF8String" 给你一个 C 字符串,也就是一个 "char*"。 - jtbandes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接