问题标签 [surrogate-pairs]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1015 浏览

java - 如何将字节从 128 映射到 255 到等效的 UTF16-LE 代理对

我正在努力实现这一目标:

我在 java Web 服务中有一个 PDF 字节 [],我必须将其作为 base64 字符串发送到 .NET 客户端,该客户端执行此操作以重建文件。

我无法更改客户端代码,现在 java web 服务正在调用另一个 .NET web 服务,该服务将 byte[] 转换为 base64 字符串:

除了可以通过各种方式制作的 base64(例如使用 org.apache.commons.codec.binary.Base64)之外,我还必须将原始 byte[] 转换为 UTF-16LE byte[]...

我试过这个:

这适用于低于 128 的值(例如 1 => 0100、2 => 0200、...、127 => 7F00),但对于高于 (128 -> 255) 的值,我不知道如何获得等效的 2 字节价值观;我知道对于字节 156 (9C) 对应的值是 8301 (0x5301) 而对于字节 224 (E0) 对应的值是 12501 (0x7D01) 但我没有设法找到一种算法来获取所有其他值。

字节值和相应的 UTF-16LE 代理对之间是否有映射表或将值从 128 映射到 255 的算法?

提前致谢!

0 投票
3 回答
1117 浏览

c# - F# 中的代理 unicode 字符问题

我正在使用字符串,它可能包含代理 unicode 字符(非 BMP,每个字符 4 个字节)。

当我使用“ \Uxxxxxxxxv ”格式在 F# 中指定代理字符时 - 对于某些字符,它给出的结果与 C# 不同。例如:

C#:

给出:Length: 2, is surrogate: True

F#:

给出:Length: 2, is surrogate: false

注意:某些代理字符在 F# 中有效(“\U0010011”、“\U00100011”),但其中一些无效。

问:这是 F# 中的错误吗?如何使用 F# 处理字符串中允许的代理 unicode 字符(F# 是否有不同的格式,或者只有使用的方法 Char.ConvertFromUtf32 0x1D11E

更新:
s.ToCharArray()为 F# 提供[| 0xD800; 0xDF41 |];对于 C#{ 0xD834, 0xDD1E }

0 投票
1 回答
576 浏览

cocoa - 提取 NSString 的第一个 Unicode 代码点(在 BMP 之外)的最简单方法?

由于历史原因,Cocoa 的 Unicode 实现是 16 位的:它0xFFFF通过“代理对”处理上面的 Unicode 字符。这意味着以下代码将不起作用:

现在,这段代码 100% 的时间都有效,但它非常冗长:

这段代码使用工作,mbtowc但它仍然非常冗长,影响全局状态,不是线程安全的,并且可能会填满自动释放池:

是否有任何简单的Cocoa/Foundation 习惯用法用于从 NSString 中提取第一个(或第 N 个)Unicode 代码点?最好是只返回代码点的单行代码?

在这篇关于 Cocoa Unicode 支持的出色总结(接近文章末尾)中给出的答案只是“不要尝试。如果您的输入包含代理对,请将它们过滤掉或其他什么,因为没有理智的方法来处理它们适当地。”

0 投票
5 回答
7019 浏览

java - 如何删除Java中的代理字符?

我正面临一种情况,即我在保存到 MySql 5.1 的文本中获取代理字符。由于不支持 UTF-16,因此我想在将其保存到数据库之前通过 java 方法手动删除这些代理对。

我现在已经编写了以下方法,我很想知道是否有直接和最佳的方法来处理这个问题。

在此先感谢您的帮助。

0 投票
3 回答
4949 浏览

python - Python:当它包含代理对时获得正确的字符串长度

考虑以下关于 IPython 的交流:

正确的输出应该是7,但是因为这七个汉字中的第五个具有高 Unicode 代码点,所以它在 UTF-8 中由“代理对”表示,而不仅仅是一个简单的代码点,因此 Python认为它是两个字符而不是一个字符。

即使我使用unicodedata,它将代理对正确地作为单个代码点(\U00026177)返回,当传递给len()错误的长度时仍然返回:

如果不采取像为 UTF-32 重新编译 Python 这样的激烈步骤,有没有一种简单的方法可以在这种情况下获得正确的长度?

我在 IPython 0.13、Python 2.7.2、Mac OS 10.8.2 上。

0 投票
1 回答
130 浏览

c# - 从 MS Word 文档中检索 SurrogatePairs

我们已经编写了一个应用程序,它将打开 Microsoft Word 文档,读取里面的所有文本,然后将这些数据发送到外部系统进行处理。这在过去运行良好,但自从我们接受 Unicode 后,我们在阅读 Word 文档时遇到了一些问题。

我们看到的问题是我们无法显示任何占用多个代码单元的字符,例如(Surrogate Pair)或ā̈(Grapheme Cluster)。当我们尝试显示 时,我们得到两个 ??,而 ā̈,我们得到组成字素的每个单独的字符。

我有一种感觉,我们看到这些字符返回的原因是因为我们没有正确读取文件。但是我一直在寻找,还没有找到解决方案。

我创建了一个只包含一个值的 Word 文档: .

我们在代码中做的第一件事是将文件读入字节数组:

经过进一步调查,字节数组包含以下值:

通过查找十六进制值,我了解到 0x3f 与 ? 相关,这就解释了为什么我们要返回两个 ??。

然后,当我们尝试将数据转换回字符串时,我们最终得到了两个 ??

我认为问题可能与我们在文档中的阅读方式有关,但我不能 100% 确定。谁能引导我走正确的道路?

0 投票
4 回答
8826 浏览

java - Java charAt 用于具有两个代码单元的字符

来自核心 Java,第一卷。1,第 9 版,第 69:

字符 ℤ 在 UTF-16 编码中需要两个代码单元。打电话

不返回空格,而是返回 ℤ 的第二个代码单元。

但似乎sentence.charAt(1) 确实返回了一个空格。例如,if以下代码中的语句计算结果为true

为什么?

如果相关,我在 Ubuntu 12.10 上使用 JDK SE 1.7.0_09。

0 投票
2 回答
8730 浏览

c# - 如何创建一个包含代理对的字符串?

我在 Jon Skeet 的博客上看到了这篇文章,他谈到了字符串反转。我想尝试他向自己展示的示例,但它似乎有效......这让我相信我不知道如何创建一个包含代理对的字符串,这实际上会导致字符串反转失败。实际上如何创建一个带有代理对的字符串,以便我自己可以看到失败?

0 投票
1 回答
889 浏览

ios - IOS中的Unicode代理对?

我有一个代理对,示例如下:

\ud83d\ude04

我想知道如何获取相应的值值,如“1F604”

任何示例代码?

任何帮助将是明显的?

0 投票
1 回答
1007 浏览

java - 如何验证 CharSequence 的实例是否是 Unicode 标量值序列?

我有一个java.lang.CharSequence. 我需要确定这个实例是否是一个Unicode 标量值序列(即该实例是否为 UTF-16 编码形式)。尽管保证java.lang.String,Java 字符串不一定是 UTF-16 编码形式(至少不是根据最新的Unicode 规范,目前是 6.2),因为它可能包含孤立的代理代码单元。(然而,Java 字符串是Unicode 16 位字符串。)

有几种明显的方法可以解决这个问题,包括:

  1. 迭代序列的代码点,将每个代码点显式验证为 Unicode 标量值。
  2. 使用正则表达式搜索孤立的代理代码点。
  3. 通过报告编码错误的字符集编码器管道传输字符序列。

然而,似乎这样的东西应该已经作为库函数存在。我只是在标准 API 中找不到它。我错过了它,还是我需要实施它?