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

发布于 2024-10-20 23:57:39 字数 1645 浏览 2 评论 0原文

我正在开发一个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

猫腻 2024-10-27 23:57:39

这些都是 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 位数量的两个字节加载到内存中,所以您的代码实际上不是字节序中性的。所以要注意这一点。

Those are all NSStringEncodings, so your code isn't correct. You want, for example:

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];

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文