我想用Java制作自己的 Charset,然后将其用于编码目的。我需要添加一些特殊的符号到我的 Charset 以及所有的数字和4种语言(繁体中文,美国英语,波兰语和俄语)。我试着浏览Charset类,但没有找到解决方案。
3wabscal1#
Basil的回答解释了您不需要定义一个定制的Charset来支持一些非标准符号。但是如果你真的需要这样做,你必须写一个扩展Charset的自定义类。你必须实现3个抽象方法:
Charset
boolean contains(Charset cs)
CharsetDecoder newDecoder()
CharsetEncoder newEncoder()
Charset API中的其他方法很可能不需要重写。解码器和编码器需要能够在包含字符集编码文本的ByteBuffer和CharBuffer中的Unicode码点之间进行转换。虽然CharsetDecoder和CharsetEncoder也是抽象类,但它们要求您(分别)实现具有复杂要求的decodeLoop或encodeLoop方法。我不知道有任何关于如何实现定制Charset及其CharsetDecoder和CharsetEncoder类的特定文档或教程,但是您应该能够在OpenJDK Java SE代码库中找到示例代码(它们将是内部类...)我试着浏览字符集类,但没有真正找到一个解决方案。那么,“解决方案”就是你需要研究现有的例子......或者得出结论,你根本不需要解决这个问题。
ByteBuffer
CharBuffer
CharsetDecoder
CharsetEncoder
decodeLoop
encodeLoop
jckbn6z72#
Unicode中的## * 专用区域 *你还没有真正解释你要达到的目标是什么,但很可能也没有必要发明:
*字符集(一组数字,每个数字分配给一个特定字符)*字符编码(一种将这些数字的示例表示为位和字节的方法)。
Unicode定义了超过144,000个字符,每个字符都被分配了一个从0到一百万多一点的数字。这就留下了大量未分配的数字。其中一些空的子范围是为将来使用而保留的。但是,您可能会感兴趣的是,其中一些子范围是为“私人使用”而保留的,Unicode联盟永远不会将其分配给字符。请参见Wikipedia。👉 你可以自由地给那些“私人使用区域”内的任何数字赋予任何你想要的含义。所以这就是你的字符集。👉 至于字符编码,使用UTF-8几乎总是最好的,这有几个原因,如here所述。Java支持所有的Unicode。所以不需要额外的编程来支持你的字符。无论遇到来自私有使用区域内部还是外部的字符,一切都是一样的。如果你想让其他人参与你的奋进,或者想分享文档,那么你应该知道有一个非官方的字符注册表分配给 * 私人使用 * 号码。这个非官方的注册表是一个志愿者的努力,在Unicode Consortium之外创建。此注册表用于Unicode中永远不会接受的字符。这包括虚构语言,如 Klingon from * 星星Trek*。在为角色选择码位数字时,您可能希望避免使用这些非正式注册的码位。
2条答案
按热度按时间3wabscal1#
Basil的回答解释了您不需要定义一个定制的
Charset
来支持一些非标准符号。但是如果你真的需要这样做,你必须写一个扩展
Charset
的自定义类。你必须实现3个抽象方法:boolean contains(Charset cs)
-判断此字符集是否包含给定的字符集。CharsetDecoder newDecoder()
为此字符集构造新的解码器。CharsetEncoder newEncoder()
为此字符集构造新的编码器。Charset
API中的其他方法很可能不需要重写。解码器和编码器需要能够在包含字符集编码文本的
ByteBuffer
和CharBuffer
中的Unicode码点之间进行转换。虽然CharsetDecoder
和CharsetEncoder
也是抽象类,但它们要求您(分别)实现具有复杂要求的decodeLoop
或encodeLoop
方法。我不知道有任何关于如何实现定制
Charset
及其CharsetDecoder
和CharsetEncoder
类的特定文档或教程,但是您应该能够在OpenJDK Java SE代码库中找到示例代码(它们将是内部类...)我试着浏览字符集类,但没有真正找到一个解决方案。
那么,“解决方案”就是你需要研究现有的例子......或者得出结论,你根本不需要解决这个问题。
jckbn6z72#
Unicode中的## * 专用区域 *
你还没有真正解释你要达到的目标是什么,但很可能也没有必要发明:
*字符集(一组数字,每个数字分配给一个特定字符)
*字符编码(一种将这些数字的示例表示为位和字节的方法)。
Unicode定义了超过144,000个字符,每个字符都被分配了一个从0到一百万多一点的数字。这就留下了大量未分配的数字。其中一些空的子范围是为将来使用而保留的。但是,您可能会感兴趣的是,其中一些子范围是为“私人使用”而保留的,Unicode联盟永远不会将其分配给字符。请参见Wikipedia。
👉 你可以自由地给那些“私人使用区域”内的任何数字赋予任何你想要的含义。所以这就是你的字符集。
👉 至于字符编码,使用UTF-8几乎总是最好的,这有几个原因,如here所述。
Java支持所有的Unicode。所以不需要额外的编程来支持你的字符。无论遇到来自私有使用区域内部还是外部的字符,一切都是一样的。
如果你想让其他人参与你的奋进,或者想分享文档,那么你应该知道有一个非官方的字符注册表分配给 * 私人使用 * 号码。这个非官方的注册表是一个志愿者的努力,在Unicode Consortium之外创建。此注册表用于Unicode中永远不会接受的字符。这包括虚构语言,如 Klingon from * 星星Trek*。在为角色选择码位数字时,您可能希望避免使用这些非正式注册的码位。