草庐IT

ios - 版权/注册符号编码不起作用

coder 2023-09-21 原文

我开发了一个 iOS 应用程序,我们可以在其中将表情符号从 iOS 发送到门户网站,反之亦然。从 iOS 发送到门户网站的所有表情符号都显示完美,除了“©和®”。

这是表情符号编码的一段代码。

NSData *data = [messageBody dataUsingEncoding:NSNonLossyASCIIStringEncoding]; 
NSString *encodedString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

//这段代码返回 \251\256 作为 copyrightregistered 表情符号的 Unicode,因为这两个 Unicode 不符合到标准代码,因此它不会显示在门户网站上。

那么我应该怎么做才能将它们转换为标准 Unicode?

测试运行:

messageBody = @"Copy right symbol : © AND Registered Mark symbol : ®";

//上面编码得到的编码字符串是

Copy right symbol : \\251 AND Registered Mark symbol : \\256

它应该在哪里(在标准 unicode 上)

Copy right symbol : \\u00A9 AND Registered Mark symbol : \\u00AE

最佳答案

首先,我将尝试提供解决方案。然后我会尝试解释原因。

转义非 ASCII 字符

要转义字符串中的 unicode 字符,您不应依赖 NSNonLossyASCIIStringEncoding。下面是我用来转义字符串中的 unicode 和非 ASCII 字符的代码:

// NSMutableString category
- (void)appendChar:(unichar)charToAppend {
    [self appendFormat:@"%C", charToAppend];
}

// NSString category
- (NSString *)UEscapedString {
    char const hexChar[] = "0123456789ABCDEF";
    NSMutableString *outputString = [NSMutableString string];
    for (NSInteger i = 0; i < self.length; i++) {
        unichar character = [self characterAtIndex:i];
        if ((character >> 7) > 0) {
            [outputString appendString:@"\\u"];
            [outputString appendChar:(hexChar[(character >> 12) & 0xF])]; // append the hex character for the left-most 4-bits
            [outputString appendChar:(hexChar[(character >> 8) & 0xF])];  // hex for the second group of 4-bits from the left
            [outputString appendChar:(hexChar[(character >> 4) & 0xF])];  // hex for the third group
            [outputString appendChar:(hexChar[character & 0xF])];         // hex for the last group, e.g., the right most 4-bits
        } else {
            [outputString appendChar:character];
        }
    }
    return [outputString copy];
}

(注意:我猜 Jon Rose 的方法也是一样的,但我不想分享我没有测试过的方法)

现在您有以下字符串:Copy right symbol :\u00A9 AND Registered Mark symbol :\u00AE

转义 unicode 完成。现在让我们将其转换回显示表情符号。

转换回来

一开始这会令人困惑,但事实就是这样:

NSData *data = [escapedString dataUsingEncoding:NSUTF8StringEncoding];
NSString *converted = [[NSString alloc] data encoding:NSNonLossyASCIIStringEncoding];

现在你的表情符号(和其他非 ASCII)回来了。

发生了什么?

问题

在您的情况下,您正在尝试在服务器端和应用程序之间创建一种通用语言。然而,NSNonLossyASCIIStringEncoding 是一个非常糟糕的选择。因为这是一个由 Apple 创建的黑匣子,我们真的不知道它在里面到底在做什么。正如我们所见,它将 unicode 转换为 \uXXXX,同时将非 ASCII 字符转换为 \XXX。这就是为什么您不应该依赖它来构建多平台系统。在后端平台和 Android 中没有等效项。

不过还是很神秘,NSNonLossyASCIIStringEncoding在第一次把\u00AE转成\256的时候,仍然可以转回®地方。我确信其他平台上有工具可以将 \uXXXX 转换为 unicode 字符,这对您来说应该不是问题。

关于ios - 版权/注册符号编码不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42825750/

有关ios - 版权/注册符号编码不起作用的更多相关文章

  1. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  2. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  3. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  4. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  5. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  6. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  7. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  8. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  9. 阿里云国际版免费试用:如何注册以及注意事项 - 2

    作为新的阿里云用户,您可以50免费试用多种优惠,价值高达1,700美元(或8,500美元)。这将让您了解和体验阿里云平台上提供的一系列产品和服务。如果您以个人身份注册免费试用,您将获得价值1,700美元的优惠。但是,如果您是注册公司,您可以选择企业免费试用,提交基本信息通过企业实名注册验证,即可开始价值$8,500的免费试用!本教程介绍了如何设置您的帐户并使用您的免费试用版。​关于免费试用在我们开始此试用之前,您还必须遵守以下条款和条件才能访问您的免费试用:只有在一年内创建的账户才有资格获得阿里云免费试用。通过此免费试用优惠,用户可以免费试用免费试用活动页面上列出的每种产品一次。如果您有多个帐

  10. ruby - 鸭子输入字符串、符号和数组的优雅方式? - 2

    这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby​​。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac

随机推荐