如何在我的NSString中正确编码Unicode字符?

问题陈述

我创build了一些string,将它们连接在一起成为CSV格式,然后通过电子邮件发送附件。

当这些string仅包含ASCII字符时,CSV文件将生成并通过电子邮件正确发送。 当我包含非ASCII字符时,结果string格式不正确,CSV文件未正确创build。 (电子邮件视图显示附件,但不发送。)

例如,这工作:

uncle bill's house of pancakes 

但是这不(注意curl的撇号):

 uncle bill's house of pancakes 

如何正确创build和编码最终string,以便包含所有有效的Unicode字符并正确地形成结果string?

笔记

  • 这些string是通过UITextField创build的,然后写入并从Core Data存储中读取。

  • 这表明问题在于string的初始创build和编码: NSString unicode编码问题

  • 我不想这样做: 在objective-c中从NSString中删除非ASCII字符

  • string被写入和从数据存储读取/罚款。 这些string在应用程序的表视图中正确显示(单独)。 这个问题仅在将string连接在一起用于电子邮件附件时才显现出来。

string处理代码

我像这样连接我的string:

 [reportString appendFormat:@"%@,", category]; [reportString appendFormat:@"%@,", client]; [reportString appendFormat:@"%@\n", detail]; etc. 

用无聊的引号代替curl的引号使其工作,但我不想这样做:

 - (NSMutableString *)cleanString:(NSString *)activity { NSString *temp1 = [activity stringByReplacingOccurrencesOfString:@"'" withString:@"'"]; NSString *temp2 = [temp1 stringByReplacingOccurrencesOfString:@"'" withString:@"'"]; NSString *temp3 = [temp2 stringByReplacingOccurrencesOfString:@"”" withString:@"\""]; NSString *temp4 = [temp3 stringByReplacingOccurrencesOfString:@"“" withString:@"\""]; return [NSMutableString temp4]; } 

编辑:电子邮件发送:

  NSString *attachment = [self formatReportCSV]; [picker addAttachmentData:[attachment dataUsingEncoding:NSStringEncodingConversionAllowLossy] mimeType:nil fileName:@"MyCSVFile.csv"]; 

formatReportCSV是连接并返回csvstring的函数。

你似乎正在运行一个string编码问题。 没有看到你的核心数据模型看起来像什么,我认为这个问题归结为由下面的代码重现的问题。

 NSString *string1 = @"Uncle bill's house of pancakes."; NSString *string2 = @" Appended with some garbage's stuff."; NSMutableString *mutableString = [NSMutableString stringWithString: string1]; [mutableString appendString: string2]; NSLog(@"We got: %@", mutableString); // We got: Uncle bill's house of pancakes. Appended with some garbage's stuff. NSData *storedVersion = [mutableString dataUsingEncoding: NSStringEncodingConversionAllowLossy]; NSString *restoredString = [[NSString alloc] initWithData: storedVersion encoding: NSStringEncodingConversionAllowLossy]; NSLog(@"Restored string with NSStringEncodingConversionAllowLossy: %@", restoredString); // Restored string with NSStringEncodingConversionAllowLossy: storedVersion = [mutableString dataUsingEncoding: NSUTF8StringEncoding]; restoredString = [[NSString alloc] initWithData: storedVersion encoding: NSUTF8StringEncoding]; NSLog(@"Restored string with UTF8: %@", restoredString); // Restored string with UTF8: Uncle bill's house of pancakes. Appended with some garbage's stuff. 

注意第一个string(使用ASCII编码)如何处理非ASCII字符的存在(如果使用dataUsingEncoding:allowsLossyConversion: ,则第二个参数为YES )。

这段代码应该解决这个问题:

 NSString *attachment = [self formatReportCSV]; [picker addAttachmentData:[attachment dataUsingEncoding: NSUTF8StringEncoding] mimeType:nil fileName:@"MyCSVFile.csv"]; 

注意:如果您需要处理非UTF8语言(如日语),则可能需要使用其中一种UTF16string编码。