为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我所有的解码字符串都有“?” 在末尾?Java 字符串解码

为什么我所有的解码字符串都有“?” 在末尾?Java 字符串解码

呼如林 2022-12-21 11:58:49
我正在使用 Tweepy 库 (Python) 和 Kafka 从 Twitter 检索推文。文本以 UTF-8 编码,如下行所示:self.producer.send('my-topic', data.encode('UTF-8'))其中“数据”是一个字符串。然后,此数据以键值格式存储到 Oracle NoSQL 数据库中。出于这个原因,推文本身是经过编码的。我用 Java 这样做:Value myValue = Value.createValue(msg.value().getBytes("UTF-8"));最后,推文由用 Java 开发的 Formatter 检索。为了将其存储在关系模式中,我必须解析推文,以便将其作为字符串检索。String data = new String(value.toByteArray(),StandardCharsets.UTF_8);如您所见,我在执行的所有步骤中都保持 UTF-8 编码。但是,当我在我的数据库中看到推文的文本时,它总是被删减。例如:RT @brIIohead:今年我不得不吞下的最难的药丸是学习无论你对某人有多好,无论多么好?注意它是如何以“?”结尾的 符号,而且已经被清楚地切断了。好吧,每条长推文都会发生这种情况。我的意思是,如果文本长度为 30 个字符,那么它显示正常,但是任何超过 100 个字符的内容都会被剪切掉。起初我以为它可能是我的表定义,但字段“文本”被声明为VARCHAR2(400 CHAR)推文在社交网络中可以包含的最大字符数。关于如何发现剪切文本和放置“?”的任何想法 符号在最后?“数据”的样子:我还必须提到,这整个块都是经过编码的。然后解码,最后解析到数据库中。所有字段都被正确解码和解析,除了被剪切的“文本”
查看完整描述

1 回答

?
慕仙森

TA贡献1827条经验 获得超8个赞

根据官方文档,一条推文不超过“140”个字符(这是一个宽泛的定义);但最近他们将其更改为280。


同一份文件说:


Twitter 使用文本的规范化形式 C (NFC) 版本计算推文的长度。


所以他们首先规范化文本(我会让你弄清楚这是如何完成的是java)。后来他们说:


Twitter 还计算文本中代码点的数量,而不是 UTF-8 字节。


因此:


String test = "RT @briIIohead: the hardest pill i had to swallow this year was learning that no matter how good you could be to somebody, no matter how mu";

System.out.println(test.codePoints().count()); // 139

似乎最初的推文是 280 个“字符”,而您使用的库并不知道这一点,因此它只使用了之前的 140 个。因为它做了一些分块,所以分块似乎也是错误的,它在最后删除了一些“部分”字节。当您尝试打印这些时 - java 不知道那些(最后)字节的实际含义(因为一些错误的分块)并且只是说?(这是当它根本不理解某些东西时显示内容的默认策略)。


查看完整回答
反对 回复 2022-12-21
  • 1 回答
  • 0 关注
  • 117 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号