xcode 4.6(4H127),xcode 4.6.3(4H1503):具有重音字符串的字符串的简单低/大写转换,具体取决于部署目标的设置。代码段:
NSString *lc1 = @"Bosnië-Herzegovina";
NSString *lc2 = [lc1 lowercaseString];
NSString *uc3 = [lc1 uppercaseString];
NSLog( @"\nlc1=%@\nlc2=%@\nuc3=%@ ", lc1,lc2,uc3);
“ë”只是输入“opt-u e”,源代码文件是常规的UTF Unicode。
lc1在调试器中看起来像预期的那样。但是,lc2和uc3字符串在末尾附加了“中文”字符,部署目标< 6.1。选择6.1后,汉字就消失了。所有这些可能只是调试器的UTF兼容性,但是对于部署目标5.0-5.1,代码片段甚至会崩溃,如下所示,这是我的问题;我实际应用程序中的字符串不是源代码,而是来自SQLite数据库。那么,此时我只能为部署目标6.0+构建我的应用程序?我错过了什么吗?
0x1c49a20: incl %eax
0x1c49a21: jmp 0x1c499fb ; CFUniCharMapCaseTo + 1275
0x1c49a23: movl 12(%ebp), %eax
0x1c49a26: movw $105, (%eax)
0x1c49a2b: movw $775, 2(%eax)
0x1c49a31: movl $2, %eax
0x1c49a36: jmp 0x1c49dac ; CFUniCharMapCaseTo + 2220
0x1c49a3b: movl 12(%ebp), %eax
0x1c49a3e: movw $105, (%eax)
0x1c49a43: movw $775, 2(%eax)
0x1c49a49: movw $771, 4(%eax)
0x1c49a4f: movl $3, %eax
0x1c49a54: jmp 0x1c49dac ; CFUniCharMapCaseTo + 2220
0x1c49a59: movl %eax, %edi
0x1c49a5b: movl 1264482(%edi), %eax
0x1c49a61: movl (%eax), %eax
0x1c49a63: movl %eax, (%esp)
0x1c49a66: movl $0, 8(%esp)
0x1c49a6e: movl $48, 4(%esp)
0x1c49a76: calll 0x1bd9980 ; CFAllocatorAllocate
0x1c49a7b: leal 16(%eax), %ecx
0x1c49a7e: movl %ecx, 1379418(%edi)
0x1c49a84: leal 32(%eax), %ecx
0x1c49a87: movl %ecx, 1379422(%edi)
0x1c49a8d: movl 1379410(%edi), %ecx
0x1c49a93: movl (%ecx), %ecx <-- EXC_BAD_ACCESS (code=1,..
0x1c49a95: movl (%ecx), %ecx
编辑: 我试着最小化项目以显示这个问题,并且......它消失了。我有一些旧式的C代码,它们使用malloc,free,freed,memmove等等。如果这个位只是存在,甚至没有调用,就会出现所描述的问题。我现在的猜测是,一些例程是从它不应加载的库中加载的。进一步挖掘。
答案 0 :(得分:0)
如果没有完全回答你的问题,但试图像其他人一样回答问题,那么就会发现没有“上层”案例与这些外国人的关联。
你能运行一个正则表达式,或某种字符串替换来修改所有已知的特殊字符与标准化(英语)版本?然后他们将进行大写或小写转换。
当然,如果拼写不正确,这可能会彻底破坏您从数据库中读取的字符串。
答案 1 :(得分:0)
好吧,我的预感是从库中加载有问题,或者加载顺序让我改变了包含框架的顺序:在“Build Phases”下我发现“CoreText.framework”是最后一个条目之一。我把它移到了最前面的位置,现在所有部署目标,5.0,5.1,6.0,6.1都可以正常工作
我实际看了一下loadmap,你可以通过将LD_GENERATE_MAP_FILE设置为yes来生成,但无济于事。
通过编辑“Scheme”并打开“Log library loads”和“Log API Usage”来提供另一个指针,因为你可以看到从各种库加载的东西,其中之一:CoreText.framework
最后,将CoreText.framework移动到列表顶部使其全部工作。
使用部署目标5.0-6.0时,您仍可以在调试器中看到“中文”字符。随着6.1甚至他们走了。我想他们现在解决了这个问题。