热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《版权/注册符号编码不起作用》经验,为你挑选了2个好方法。

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

这是表情符号编码代码片段.

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

//这段代码\251\256作为Unicodes copyright和emojis 返回registered,因为这两个Unicode不符合标准代码,所以它不会显示在门户网站上.

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

测试运行 :

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

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

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

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

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

Jon Rose.. 5

messageBody是一个字符串,没有理由将其转换为数据,只是将其转换回字符串.替换你的代码

NSString *encodedString = messageBody;

如果messageBody对象不正确,那么修复它的方法是更改​​它的创建方式.服务器发送数据,而不是字符串.服务器发送的数据是以某种商定的方式编码的.通常,此编码为UTF-8.如果您知道编码,则可以将数据转换为字符串; 如果你不这样做,那么数据是无法读取的乱码.如果messageBody不正确,则从服务器发送的数据转换时出现问题.您似乎可能使用不正确的编码解析它.

您发布的代码完全错误.它使用一种编码(ASCII)将字符串转换为数据,并使用不同的编码(UTF8)读取数据.这就像将一本书翻译成西班牙语,然后让一位葡萄牙语的人将其翻译回来 - 它可能适用于某些词语,但它仍然是错误的.

如果您仍然遇到问题,那么您应该共享messageBody创建位置的代码.

如果你的服务器期望一个ASCII字符串,其中所有unicode字符都改为\ u00xx那么你应该先对你的服务器员大喊大叫,因为他是个白痴.但如果这不起作用,您可以执行以下代码

NSString* messageBody = @"Copy right symbol : © AND Registered Mark symbol : ®";
NSData* utf32Data = [messageBody dataUsingEncoding:NSUTF32StringEncoding];
uint32_t *bytes = (uint32_t *) [utf32Data bytes];
NSMutableString* escapedString = [[NSMutableString alloc] init];
//Start a 1 because first bytes are for endianness
for(NSUInteger index = 1; index 


Mert Buran.. 5

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

转义非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 > 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字符,这对你来说应该不是问题.



1> Jon Rose..:

messageBody是一个字符串,没有理由将其转换为数据,只是将其转换回字符串.替换你的代码

NSString *encodedString = messageBody;

如果messageBody对象不正确,那么修复它的方法是更改​​它的创建方式.服务器发送数据,而不是字符串.服务器发送的数据是以某种商定的方式编码的.通常,此编码为UTF-8.如果您知道编码,则可以将数据转换为字符串; 如果你不这样做,那么数据是无法读取的乱码.如果messageBody不正确,则从服务器发送的数据转换时出现问题.您似乎可能使用不正确的编码解析它.

您发布的代码完全错误.它使用一种编码(ASCII)将字符串转换为数据,并使用不同的编码(UTF8)读取数据.这就像将一本书翻译成西班牙语,然后让一位葡萄牙语的人将其翻译回来 - 它可能适用于某些词语,但它仍然是错误的.

如果您仍然遇到问题,那么您应该共享messageBody创建位置的代码.

如果你的服务器期望一个ASCII字符串,其中所有unicode字符都改为\ u00xx那么你应该先对你的服务器员大喊大叫,因为他是个白痴.但如果这不起作用,您可以执行以下代码

NSString* messageBody = @"Copy right symbol : © AND Registered Mark symbol : ®";
NSData* utf32Data = [messageBody dataUsingEncoding:NSUTF32StringEncoding];
uint32_t *bytes = (uint32_t *) [utf32Data bytes];
NSMutableString* escapedString = [[NSMutableString alloc] init];
//Start a 1 because first bytes are for endianness
for(NSUInteger index = 1; index 



2> Mert Buran..:

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

转义非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 > 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字符,这对你来说应该不是问题.


推荐阅读
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了如何找到并终止在8080端口上运行的进程的方法,通过使用终端命令lsof -i :8080可以获取在该端口上运行的所有进程的输出,并使用kill命令终止指定进程的运行。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 移动端常用单位——rem的使用方法和注意事项
    本文介绍了移动端常用的单位rem的使用方法和注意事项,包括px、%、em、vw、vh等其他常用单位的比较。同时还介绍了如何通过JS获取视口宽度并动态调整rem的值,以适应不同设备的屏幕大小。此外,还提到了rem目前在移动端的主流地位。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 本文介绍了使用Python编写购物程序的实现步骤和代码示例。程序启动后,用户需要输入工资,并打印商品列表。用户可以根据商品编号选择购买商品,程序会检测余额是否充足,如果充足则直接扣款,否则提醒用户。用户可以随时退出程序,在退出时打印已购买商品的数量和余额。附带了完整的代码示例。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文介绍了一种在PHP中对二维数组根据某个字段进行排序的方法,以年龄字段为例,按照倒序的方式进行排序,并给出了具体的代码实现。 ... [详细]
author-avatar
睿芬惠洁育瑋
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有