0

Javadoc说:

仅写入整数 oneChar 的低两个字节。

如果有的话,这对编写已转换为 int 的非 utf8 编码字符有什么影响?

更新:

有问题的代码从套接字接收数据并将其写入文件。(接收和写入之间会发生很多事情,所以我不能只使用通过 BufferedReader#readLine() 获得的字符串)。我使用的是 Writer#write(char[]) 但这意味着我每次都必须创建一个新的 char 数组。为了避免每次都创建一个数组,我有一个用 -1 填充的 char 数组(转换为 char)。

然后我使用TextUtils#getChars来填充它,并在必要时扩展数组。对于写入,我循环遍历数组,写入 Writer 直到 char[i] == (char) -1 == true。

4

1 回答 1

0

在内部, write(int)只会将其参数转换为char,因此write(i)相当于write((char)i).

现在在 Java 中,内部char只是一个整数类型,范围为 0-65535(即 16 位)。强制转换 int -> char 是“缩小原始转换”(Java 语言规范,5.1.3),并且int是有符号整数,因此:

有符号整数到整数类型 T 的窄化转换只会丢弃除 n 个最低位之外的所有位,其中 n 是用于表示类型 T 的位数。除了可能丢失有关数值大小的信息之外,这可能会导致结果值的符号与输入值的符号不同。

这就是 Javadoc 说只写入低两个字节的原因。

现在,这在字符方面的含义取决于您要如何解释 int 值。Java 中的Achar表示 UTF-16 中的 Unicode 码位,即 char 所代表的 16 位数字被解释为 Unicode 码位的编号。因此,如果您的每个 int 值都是 16 位代码点的编号,那么您很好(实际上,这仅适用于 BMP 中的字符;如果您在辅助平面中使用字符,则每个 Unicode 代码点都将被编码成两个chars)。如果它是其他任何东西(包括超过 16 位的代码点,或负数,或完全其他的东西),你会得到垃圾。

如果有的话,这对编写已转换为 int 的非 utf8 字符有什么影响?

没有“非 utf8 字符”之类的东西。UTF-8 是一种编码,这是一种表示 Unicode 代码点的方式,所以提出的问题毫无意义。也许你可以解释你的代码是做什么的?

于 2010-09-06T20:42:31.953 回答