【发布时间】:2017-12-17 16:04:06
【问题描述】:
假设有一个 emoji 字符的十六进制字符串,如“1f1e81f1f3”,它是一个 emoji 字符代码点的格式不正确的十六进制字符串,它应该是两个字符串,如1f1e81f1f3
我正在使用org.apache.commons.codec.binary.Hex 来解码十六进制字符串,但显然十六进制需要输入字符串的长度是偶数,所以我需要使十六进制字符串采用零填充样式,如“0@ 987654327@01f1f3".
目前,我只是将“1f”替换为“01f”,到目前为止还不错,但由于an emoji glyph may contains a sequence of unicode characters,所以
- 简单地将“1f”替换为“01f”是否安全?
- 如果不安全,如何安全/正确地解码此类十六进制字符串并恢复/翻译它们以更正表情符号字符/character_sequence?看来我需要实现一个自定义的 UTF16BE 解码器?
背景
这个表情符号的十六进制字符串是从“<span class="emoji emojiXXXXXXXXXX"></span>”字符串中剥离出来的,它是通过非官方的 HTTP API 从流行的 IM 软件中检索到的文本消息。
【问题讨论】:
-
呃,显然不安全,对于标题中的示例十六进制字符串甚至都不安全,
1f1f3变成了01f01f3。 -
唯一安全的方法是在相应的样式表中查找
emojiXXXXXXXXXX类的定义。 -
<span class="emoji emoji1f1e8"></span><span class="emoji emoji1f1f3"></span>来源?然后,您可以获得格式正确的十六进制字符串,而不是 格式错误。 -
@JosefZ,不,它们没有分开,一个表情符号只使用一个
<span>,一个表情符号的所有字符序列在@的class属性内用十六进制字符串表示987654336@ 元素。我使用以下正则表达式来提取十六进制字符串:<span class=\"emoji emoji(\\p{XDigit}+)\"></span>.