1

"test \u00e8"NSStringなどの UTF8 文字を 含む文字列を含む があります <- これを含む文字列を持つことは、次のものを持つこととは異なることに注意してください。

NSString *a = @"test \u00e8";

代わりに、次のような文字列を持つことと同じです。

NSString *a = @"test \ \ u00e8"; //note the double \\ for escape...

だから..明らかに、「test è」[NSString stringWithUTF8String:...]という目的の文字列を取得できません。

文字列を変換して、読み取り可能な utf8 文字にする方法はありますか?

4

2 に答える 2

0

\uabcd通常は、ではなくコンパイル時にコンパイラによって解析されるという理由で、自分で何かを作成する必要があると思いますNSString。幸いなことに、それほど難しいことではないと思います。

NSString *fragments = [string componentsSeparatedByString:@"\u"];

if([fragments count])
{
    NSObjectEnumerator *stringEnumerator = [fragments objectEnumerator];
    NSMutableString *decodedString = 
                  [[[stringEnumerator nextObject] mutableCopy] autorelease];

    NSString *nextFragment;
    while(nextFragment = [stringEnumerator nextObject])
    {
         if([nextFragment length] >= 4)
         {
              unichar decodedCharacter = 0;

              for(int c = 0; c < 4; c++)
              {
                  unichar hexValue = [nextFragment characterAtIndex:c];

                  if(hexValue >= 'a')
                      hexValue = 0xa + (hexValue - 'a');
                  else
                      hexValue = hexValue - '0';

                  decodedCharacter = (decodedCharacter << 4) + hexValue;
              }

              [decodedString appendFormat:@"%C", decodedCharacter];
              [decodedString appendString:[nextFragment substringFromIndex:4]];
         }
         else
         {
              // there seems to be a parsing error; maybe just append
              // next fragment?
         }
    }

    NSLog(@"decoded string is %@", decodedString);
}
于 2012-10-02T22:37:23.117 に答える
0

素晴らしい!出来た。少し構文エラーがあったため、これは正しいコードです。

NSArray *fragments = [str componentsSeparatedByString:@"\\u"];
if([fragments count])
{
    NSEnumerator *stringEnumerator = [fragments objectEnumerator];
    NSMutableString *decodedString =
    [[stringEnumerator nextObject] mutableCopy];

    NSString *nextFragment;
    while(nextFragment = [stringEnumerator nextObject])
    {
        if([nextFragment length] >= 4)
        {
            unichar decodedCharacter = 0;

            for(int c = 0; c < 4; c++)
            {
                unichar hexValue = [nextFragment characterAtIndex:c];

                if(hexValue >= 'a')
                    hexValue = 0xa + (hexValue - 'a');
                else
                    hexValue = hexValue - '0';

                decodedCharacter = (decodedCharacter << 4) + hexValue;
            }

            [decodedString appendFormat:@"%C", decodedCharacter];
            [decodedString appendString:[nextFragment substringFromIndex:4]];
        }
        else
        {
            // there seems to be a parsing error; maybe just append
            // next fragment?
        }
    }
    return decodedString;
}
return str;

どうもありがとうございました!

于 2012-10-03T08:33:28.007 に答える