xcode UTF-8文字

the*_*olf 21 unicode xcode objective-c

假设我MUSICAL SYMBOL G CLEF在Objective-C源文件中的字符串文字中有符号:****.

OS X字符查看器表示CLEF 在其术语中是UTF8 F0 9D 84 9E和Unicode 1D11E(D834+DD1E).

经过一些困难,并使用ICU UNICODE演示页面,我确实得到以下代码:

NSString *uni=@"\U0001d11e";
NSString *uni2=[[NSString alloc] initWithUTF8String:"\xF0\x9D\x84\x9E"];
NSString *uni3=@"";
NSLog(@"unicode: %@ and %@ and %@",uni, uni2, uni3);
Run Code Online (Sandbox Code Playgroud)

我的问题:

  1. 是否有可能简化我使用UTF-8文字的方式?这对我来说似乎很糟糕.
  2. 部件是@"\U0001d11eUTF-32吗?
  3. 为什么从Character Viewer中剪切和粘贴CLEF实际上有效?我认为Objective-C文件必须是UTF-8?

Ano*_*mie 11

  1. 我更喜欢你这样做的方式uni3,但遗憾的是不建议这样做.如果做不到这一点,我宁愿方法uni,以在uni2.另一种选择是[NSString stringWithFormat:@"%C", 0x1d11e].
  2. 它是一个"通用字符名称",在C99(第6.4.3节)中引入,并从OS X 10.5开始导入Objective-C.从技术上讲,这不需要给你UTF-8(这取决于编译器),但实际上UTF-8可能是你得到的.
  3. 源代码文件的编码可能是UTF-8,匹配运行时期望的内容,因此一切正常.源文件也可能是UTF-16或UTF-32,并且编译器在编译时正在做正确的事情.尽管如此,Apple并不推荐这样做.


daw*_*awg 8

您的问题的答案(相同的顺序):

  1. 为什么选择?xcode在默认设置中使用C99.请参阅关于通用字符名称的C0X规范草案6.4.3.见下文.

  2. 从技术上讲,它@"\U0001d11eISO 10646字符集中该字符的32位Unicode代码点.

  3. 我不会指望这种行为有效.毫无疑问,您应该毫无疑问地将源文件中的所有字符都设置为7位ASCII.对于字符串文字,请使用编码,或者最好使用能够处理二进制数据的合适外部资源.

通用角色名称(来自WG14/N1256 C0X草案,CLANG相当顺利):

通用字符名称可用于标识符,字符常量字符串文字中,以指定不在基本字符集中的字符.

通用字符名称\ Unnnnnnnn指定其八位短标识符(由ISO/IEC 10646指定)为nnnnnnnn的字符.类似地,通用字符名称\ unnnn指定其四位短标识符为nnnn的字符(其中八个-digit short identifier是0000nnnn).

因此,您可以以自然,混合的方式制作您的角色或弦乐:

char *utf8CStr = 
   "May all your CLEF's \xF0\x9D\x84\x9E be left like this: \U0001d11e";
NSString *uni4=[[NSString alloc] initWithUTF8String:utf8CStr];
Run Code Online (Sandbox Code Playgroud)

\Unnnnnnnn表格允许您选择任何Unicode代码点,这是相同的值在角色阅读器左下角的"统一"字段.\UnnnnnnnnC99源文件中的直接输入由编译器适当处理.请注意,只有两个选项:\unnnn默认代码页为256字符的偏移量,或者\Unnnnnnnn是任何Unicode代码点的完整32位字符.如果你没有使用全部4个或全部8个数字或\ u或\ U,你需要用0填充左边.

的形式\xF0\x9D\x84\x9E相同的字符串字面中更有趣.这是插入相同字符的原始UTF-8编码.一旦传递给initWithUTF8String方法,但文字和编码的文字最终编码为UTF-8.

可以说,以这种方式使用原始字节可能违反了第5.1.1.2节中130.鉴于原始的UTF-8字符串编码类似,我认为你没问题.