在iOS应用程序开发中,我需要显示一些日文字符,它是2个字节,但我找不到正确的编码来使用

时间:2011-03-07 01:32:55

标签: ios unicode encoding nsstring

我正在开发一个iOS应用程序,我遇到了日文编码问题。

日语字符流从远程服务器发送到应用程序,每个字符都有两个字节(包括平假名,片假名和汉字)。

以下是代码:

uint8_t bytes[2];

bytes[0] = firstByte;    // First byte of the Japanese character    
bytes[1] = secondByte;   // second byte,   

NSMutableData* data =   [[NSMutableData alloc] init];
[data appendBytes:bytes length:2];

UInt32 encoding = CFStringConvertEncodingToNSStringEncoding(someJapaneseEncoding);  // need to find a correct encoding to use 
NSString* str = [[NSString alloc] initWithData:data encoding:encoding];

然后代码将* str打印到屏幕并在手机上绘图,但问题是,无论我使用什么编码,str都无法正确显示。它们变成乱码,空间或其他语言,如韩语或泰语字符,但它们永远不会用日语显示。

我试过的编码是(还有更多,我尝试了很多编码):

  • NSASCIIStringEncoding 7ビットASCIIエンコード
  • NSNEXTSTEPStringEncoding NeXTSTEP拡张8ビットASCIIエンコード
  • NSJapaneseEUCStringEncoding日本语EUC
  • NSUTF8StringEncoding 8ビットUnicode(UTF8)エンコード
  • NSISOLatin1StringEncoding ISOラテン1エンコード
  • NSISOLatin2StringEncoding ISOラテン2エンコード
  • NSSymbolStringEncodingシンボルエンコード
  • NSNonLossyASCIIStringEncoding损失无し7ビットASCIIエンコード
  • NSShiftJISStringEncodingシフトJIS
  • NSUnicodeStringEncoding Unicodeエンコード
  • NSWindowsCP1251StringEncodingアドビスタンダードCyrillic
  • NSWindowsCP1252StringEncoding Winラテン1
  • NSWindowsCP1253StringEncoding Greek
  • NSWindowsCP1254StringEncoding Turkish
  • NSWindowsCP1250StringEncoding Winラテン1
  • NSISO2022JPStringEncoding ISO2022日本语ArechiezoTド(电子メールなど)
  • NSMacOSRomanStringEncoding MacRoman
  • NSProprietaryStringEncoding

我真的需要帮助,我在网上搜索了几天但没有运气......请帮忙......

1 个答案:

答案 0 :(得分:1)

这些都是NSStringEncodings,因此您的代码不正确。你想要,例如:

uint8_t bytes[2];

bytes[0] = firstByte;    // First byte of the Japanese character    
bytes[1] = secondByte;   // second byte,   

NSMutableData* data =   [[NSMutableData alloc] init];
[data appendBytes:bytes length:2];

NSString* str = [[NSString alloc] initWithData:data 
                                           encoding:NSUTF16StringEncoding];

即。没有调用CFStringConvertEncodingToNSStringEncoding,因为你没有以CFStringEncoding开头。

实际上,如果iPhone支持你的神秘编码,我希望它是NSUTF16StringEncoding,或显式NSUTF16BigEndianStringEncoding或NSUTF16LittleEndianStringEncoding,因为它们是唯一的双字节类型。

因为您以固定顺序将16位数量的两个字节加载到内存中,所以您的代码实际上并不是字节中性的。所以注意这一点。