Java -将2个代码点的char转换为单个代码点的char

ttvkxqim  于 2023-06-28  发布在  Java
关注(0)|答案(2)|浏览(101)

我正在处理一个文本,然后我必须链接到文件。文本有一个(unicode points 97 + 776),但FS将文件写成ä(unicode points 228)。有办法把97 + 776转换成228吗?我相信这些应该是替代对,并且是UTF-8编码的,我已经尝试过getBytes作为UTF-16或其他编码,但没有任何效果。我甚至不能正确地粘贴2个代码点的char-它被处理为单个char,但十六进制表示仍然是“61 cc 88”,这个“a”到底是什么?

t9aqgxwy

t9aqgxwy1#

有两个代码点的那个不是一个代理对,而是一个“a”和一个组合变音符号“¨”,导致与预组合(=字符和变音符号在一起)字符“ä”相同的视觉外观(在支持它的字体中)。
要在两者之间转换,您需要一个名为Normalizer的东西。Java的内置类java.text.Normalizer应该可以帮助你,看看https://stackoverflow.com/a/58403649/12344762以获得更多信息。

k5hmc34c

k5hmc34c2#

字符“ä”在Unicode中可以用两种不同的方式表示:
作为Unicode码位为228(U+00E4)的单个字符。作为两个字符的组合:Unicode码位为97(U+0061)的“a”,后跟一个码位为776(U+0308)的组合分音符。这两种表示都是有效的,但它们在Unicode码位方面不可互换。如果您的文件系统使用单字符方法(代码点228)表示“ä”,并且您的文本使用两个字符表示(97 + 776),则需要转换文本以匹配文件系统的表示。
要将双字符表示(97 + 776)转换为单字符表示(228),可以使用支持Unicode操作的编程语言或库提供的规范化函数。一种常见的标准化形式是Unicode标准化形式C(NFC)。
下面是一个使用java.text.Normalizer类执行规范化的Java示例:

import java.text.Normalizer;

String text = "a\u0308";  // Two-character representation (97 + 776)
String normalizedText = Normalizer.normalize(text, Normalizer.Form.NFC);
System.out.println(normalizedText);  // Output: ä

在本例中,以Normalizer.Form.NFC作为参数的Normalizer.normalize方法将两个字符表示转换为单个字符“ä”(U+00E4)。
请注意,规范化过程可能涉及其他转换和调整,以确保文本的一致性,因此在比较或处理文本之前规范化文本始终是一个很好的做法。
如果您使用的是不同的编程语言,请告诉我,我可以提供有关如何在该特定语言中执行转换的指导。

相关问题