【问题标题】:iPhone, string from utf8 xml with wrong charactersiPhone,来自 utf8 xml 的字符串,字符错误
【发布时间】:2025-12-05 02:00:01
【问题描述】:

我必须显示包含在我从网络上获取的 xml 文件中的文本。文件开头为:

...

然后是文本节点,这样写:

这是很好的 utf-8 格式文本吗?

我已经尝试了所有这些,但仍然无法将“Ô替换为“à”和“è”替换为“è”:

text = ^the string from above^
NSData* data_text = [text dataUsingEncoding:NSUTF8StringEncoding];
NSString* text_c3 = [[NSString alloc] initWithBytes:[data_text bytes] length:[data_text length] encoding:NSUTF8StringEncoding];

const char* utfstring = "E ancora, il fascino delle città del nord,";// [text UTF8String];
NSString* text_c1 = [[NSString alloc] initWithUTF8String:utfstring];
NSString* text_converted = [NSString stringWithCString:utfstring encoding:NSUTF8StringEncoding];

有什么建议吗? 谢谢。

【问题讨论】:

  • 在 xml 中是否有 à 或 Ã ?
  • utfstring 不是一个 UTF8String 字符串,它只是一个 8 位字符串,可能是内部 kCFStringEncodingMacRoman 格式,它对这些字符的编码范围在 129-255 之间。在 unicode 中,这些字符将由多个(在本例中为两个)8 位代码组成,

标签: iphone ios xml utf-8 rss


【解决方案1】:

无法从您的问题中判断 CDATA 部分是否正确 UTF-8 编码。由于编码数据是二进制数据,您需要发布二进制数据(即以十六进制表示)而不是一些文本。

此外,您的所有代码示例都依赖于以正确编码存储的源代码文件,这同样无法从您的问题中确定。

我建议你使用一个像样的 XML 解析器来解析 XML 数据,比如内置的 NSXMLParser 类。当它遇到 CDATA 部分时,它将调用您的委托并将文本作为 UTF-8 编码的二进制数据传递,无论原始编码是什么。然后您可以将其转换为字符串:

- (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)cdataBlock
{
    NSString *text = [NSString stringWithUTF8String: [cdataBlock bytes]];

    // do something with the text...
}

并确保您将 XML 文件作为二进制数据检索,并将其作为 XML 数据传递给 XML 解析器。否则,您将有不必要的解码和编码,并且您可能会损坏编码。

【讨论】:

    【解决方案2】:

    NSURL *url = [NSURL URLWithString:@"http://www.yourURL.com"];

    //NSString *jsonRequest = [NSString stringWithFormat:@"&json_data=%@",[[NSString stringWithFormat:@"{\"createInvoice\":{\"client_id\":\"%@\",\"address\":\"\",\"invoice_title\":\"%@\",\"number\":\"\",\"date\":\"%@\",\"due_date\":\"%@\",\"late_fee\":\"\",\"schedule_date\":\"%@\",\"po_number\":\"\",\"status\":\"paid\",\"notes\":\"invoice notes\",\"terms\":\"invoice terms\",\"items\":[{\"name\":\"Test4\",\"type\":\"Product\",\"description\":\"\",\"unit_cost\":\"15\",\"quantity\":\"100\",\"discount\":\"10\",\"discount_type\":\"Percent\",\"tax1_name\":\"\",\"tax1_type\":\"\",\"tax2_name\":\"\",\"tax2_type\":\"\",\"tax1_percent\":\"\",\"tax2_percent\":\"\"}]}}",selected_Client_ID,invoiceTitleTxtFld.text,invoiveDateTxtFld.text,invoiceDueDateTxtFld.text,scheduleOnTxtFld.text] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    
    
    
    NSString *jsonRequest = [NSString stringWithFormat:@"&json_data=%@",[[NSString stringWithFormat:@"{\"updateInvoice\":{\"invoice_id\":\"%@\",\"client_id\":\"60105\",\"address\":\"ABS\",\"invoice_title\": \"%@\",\"number\":\"inv-7774 new\",\"date\":\"2012-03-30\",\"due_date\":\"2012-04-30\",\"late_fee\":\"\",\"schedule_date\":\"2012-03-31\",\"po_number\":\"PO-7770\",\"status\":\"paid\",\"notes\":\"invoice notes\",\"terms\":\"invoice terms\",\"items\":[{\"name\":\"Test4\",\"type\":\"Product\",\"description\":\"Test4 desc\",\"unit_cost\":\"15\",\"quantity\":\"100\",\"discount\":\"10\",\"discount_type\":\"Percent\",\"tax1_name\":\"\",\"tax1_type\":\"\",\"tax2_name\":\"\",\"tax2_type\":\"\",\"tax1_percent\":\"\",\"tax2_percent\":\"\"}]}}",delegate.invoice_ID,invoiceTitleTxtFld.text] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    
    
    NSData *json_data = [NSData dataWithBytes:[jsonRequest UTF8String] length:[jsonRequest length]];
    
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
    
    
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody: json_data];
    NSLog(@"%@",json_data);
    //[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    //[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setValue:[NSString stringWithFormat:@"%d", [json_data length]] forHTTPHeaderField:@"Content-Length"];
    [request setHTTPBody:[[jsonRequest stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]
                          dataUsingEncoding:NSUTF8StringEncoding 
                          allowLossyConversion:YES]];
    
    //  [NSURLConnection connectionWithRequest:[request autorelease] delegate:self];
    

    NSURLConnection *conn_InvEdit = [[NSURLConnection alloc] initWithRequest:请求 委托:自己];

    // Successful connection.
    if (conn_InvEdit) {
    
        // [self initSpinner];
        // [self spinBegin];
    
        NSMutableData *data = [[NSMutableData alloc] init];
        self.receivedData=data;
        [data release];
    } 
    // Unsuccessful connection.
    else {
    
    }  
    // Clean up
    [url release];
    [request release];
    // Close keypad.
    
    Try with this code, If you still have any problem then send me your complete question at  akram.khan@mail.vinove.com. I'll send you sample app with solution.
    

    【讨论】:

      【解决方案3】:

      ...

      像这样添加标签

      ...

      并使用

      [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

      and [request setValue:[NSString stringWithFormat:@"%d", [json_data length]] forHTTPHeaderField:@"Content-Length"]; [请求 setHTTPBody:[[jsonRequest stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding] dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]];

      【讨论】: