Java Swing - JTextField/JTextArea无法粘贴补充的Unicode字符

5

我已经在stackoverflow和Google上进行了详尽的搜索,但到目前为止仍未能找到其他人遇到类似的问题。

在一个Java Swing测试程序中,我创建了一个普通的JTextField,以便我可以尝试从网页(http://isthisthingon.org/unicode/)中将字符粘贴到它里面。当我尝试使用“㓿”(代码点13567)进行测试时,它能够成功地粘贴该字符。这个字符是CJK表意符号扩展A平面中最后一个列出的字符。然而,当我移动到下一个相关的平面,即CJK表意符号扩展B时,尝试复制和粘贴字符“”(代码点131072)失败了。它不会呈现出框或任何形式的字形,似乎就好像我根本没有将其复制到系统剪贴板中一样。

我知道CJK表意符号扩展B是一组被认为是“补充”的字符,当Java在内部以UTF-16编码时需要两个16位块,而不是一个。进一步的测试证明,如果我将文本硬编码到显示区域中,我就能够显示这些补充字符。

这是在Windows 7和Java 6上进行的测试。

我知道自Java 5以来,已经添加了对补充Unicode字符的支持,但我想知道为什么(或是否)Swing中的剪切和粘贴功能仍然不允许我粘贴这些字符。当使用JTextField或JTextArea类时,是否还需要执行其他操作来告诉Java处理这些字符?Java的Swing库现在能否将这些字符粘贴到文本字段中?

谢谢您抽出宝贵的时间!


1
我刚发完这条信息,可能就找到了答案。这是JDK中的一个长期存在的bug - http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6877495。 - Locriansax
Unicode在其大部分的生命周期中,其字符数量已超过16位整数所能容纳!我无法相信Java仍然存在这个问题。但昨天我在Java String类中发现了另一个UCS-2 bug,它一直存在。这太荒谬了。整个UTF-16是可怕的诅咒,而Java将永远无法摆脱它造成的无数错误。它们只是无处不在,这让人发疯。人们只是无法做到完美。 - tchrist
谢谢Alexey!刚刚创建了一个答案。 :) - Locriansax
@tchrist - 你在String类中发现的bug是什么?如果它已经作为正式bug提交,你能否也发布链接?我一直在工作中处理很多i18n相关的事情,了解Java在补充字符集方面的怪癖越多,就越好! - Locriansax
1
@Locriansax:不,我没有报告这个错误,我把它发送到了我所在的i18n-dev openjdk列表。你可以在这里找到那封邮件。问题在于代码通过部分代码点而不是完整代码点处理事物,因此会得到错误的答案。直到2001年3月Unicode 3.1出现,引入了Deseret脚本,这是一个在星际平面上进行大小写转换的脚本,才被发现。它已经损坏了超过10年。我认为所有基于字符的Java代码都高度可疑,必须先证明其无罪。这是一个安全的假设。 - tchrist
太棒了 - 感谢提供链接! - Locriansax
1个回答

2
我一发布这个帖子,可能就找到了答案。这是JDK中一个长期存在的错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接