在iOS应用程序开发中,我需要显示一些日语字符,它是2个字节,但我找不到正确的编码来使用
我正在开发一个 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ビttoASCIIエンコードNS
- JapaneseEUCStringEncoding 日本语EUC
- NSUTF8StringEncoding 8ビttoUnicode(UTF8)エンコード
- ISOoraten2
- NSISOLatin1StringEn编码 ISOoraten1enkodoNSISOLatin2StringEncoding エンコード
- NSSymbolStringEncoding シンボルエンコード
- NSNonLossyASCIIStringEncoding 損失無し7ビットASCIIエンコード
- NSShiftJISStringEncoding シフトJIS
- NSUnicodeStringEncoding Unicodeエンコード
- NSWindowsCP1251StringEncoding アドビスタンダードCyrillic
- NSWindowsCP1252StringEncoding Winラテン1
- NSWindowsCP1253StringEncoding Greek
- NSWindowsCP1254StringEncoding Turkish
- NSWindowsCP1250StringEncoding Winラテン1
- NSISO2022JPStringEncoding ISO2022日本語エンコード(電子メールなど)
- NSMacOSRomanStringEncoding MacRoman
- NSProprietaryStringEncoding
I really need help关于这个,我在网上搜索了好几天,但没有运气......请帮忙......
i'm developing an iOS app and i encountered encoding problem with Japanese.
The Japanese character stream is sent to the app from a remote server, and every character has two bytes, (including hiragana, katakana, and kanji).
Here's the code:
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];
Then the code will print the *str to the screen and draw in on the phone, but the problem is that, no matter what encoding i use, the str can't be display correctly. they becomes gibberish, or space, or some other language like Korean or Thai characters, but they never be displayed in Japanese.
The encoding i have tried are (and more, i tried lots of encodings):
- 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日本語エンコード(電子メールなど)
- NSMacOSRomanStringEncoding MacRoman
- NSProprietaryStringEncoding
I really need help on this, i've searched online for days but no luck...please help...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这些都是 NSStringEncodings,因此您的代码不正确。例如,您想要:
即不调用 CFStringConvertEncodingToNSStringEncoding,因为您不是从 CFStringEncoding 开始。
实际上,如果 iPhone 支持您的神秘编码,我希望它是 NSUTF16StringEncoding,或者显式 NSUTF16BigEndianStringEncoding 或 NSUTF16LittleEndianStringEncoding,因为它们是唯一的两字节类型。
因为您以固定顺序将 16 位数量的两个字节加载到内存中,所以您的代码实际上不是字节序中性的。所以要注意这一点。
Those are all NSStringEncodings, so your code isn't correct. You want, for example:
i.e. without the call to CFStringConvertEncodingToNSStringEncoding, because you're not starting with a CFStringEncoding.
In practice, if the iPhone supports your mystery encoding I'd expect it to be NSUTF16StringEncoding, or explicitly NSUTF16BigEndianStringEncoding or NSUTF16LittleEndianStringEncoding, since they're the only two-byte types.
Because you're loading the two bytes of a 16bit quantity into memory in a fixed order, your code isn't actually endian neutral. So watch for that.