• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-13 02:18:23 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

问题陈述

我创建了许多字符串,将它们连接成 CSV 格式,然后将字符串作为附件通过电子邮件发送。

当这些字符串仅包含 ASCII 字符时,将正确构建 CSV 文件并通过电子邮件发送。当我包含非 ASCII 字符时,结果字符串格式不正确,并且 CSV 文件未正确创建。 (电子邮件 View 显示附件,但未发送。)

例如,这是可行的:

uncle bill's house of pancakes

但这不是(注意大撇号):

uncle bill’s house of pancakes

问题

如何正确创建和编码最终字符串,以便包含所有有效的 unicode 字符并正确形成结果字符串?

注意事项

  • 字符串是通过 UITextField 创建的,然后写入核心数据存储区,然后再从核心数据存储区读取。

  • 这表明问题在于字符串的初始创建和编码: NSString unicode encoding problem

  • 我不想这样做: remove non ASCII characters from NSString in objective-c

  • 字符串可以很好地写入数据存储或从数据存储中读取。字符串在应用程序的表格 View 中正确(单独)显示。该问题仅在将电子邮件附件的字符串连接在一起时才会出现。

字符串处理代码

我像这样将我的字符串连接在一起:

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

用无聊的引号代替大引号可以让它工作,但我不想这样做:

- (NSMutableString *)cleanStringNSString *)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 是连接并返回 csv 字符串的函数。



Best Answer-推荐答案


您似乎遇到了字符串编码问题。在没有看到您的核心数据模型是什么样子的情况下,我认为问题归结为以下代码重现的问题。

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.

请注意第一个字符串(使用 ASCII 编码)如何无法处理非 ASCII 字符的存在(如果您使用 dataUsingEncoding:allowsLossyConversion: 并且第二个参数是 是的)。

这段代码应该可以解决问题:

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

注意:如果您需要处理日语等非 UTF8 语言,您可能需要使用其中一种 UTF16 字符串编码。

关于ios - 如何在我的 NSString 中正确编码 Unicode 字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16078747/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap