【问题标题】:How can I generate non-UTF-8 string / char in Java for testing purposes?如何在 Java 中生成非 UTF-8 字符串/字符以用于测试目的?
【发布时间】:2019-01-22 04:18:27
【问题描述】:

我想我到处都看过了。在 Ruby 中找到了一些示例,但在 Java 中却没有。

如何在 Java 中生成非 UTF-8 字符串/字符以用于测试目的?

具体来说,我有一个json 文件,其中包含与我们使用的某些翻译机制相关的不同键值(因此,涉及很多语言),这个json 使用我们拥有的一些映射器进行解析。

我想检查映射器是否返回正确的值,以防在json 中遇到非 UTF 数据。

所以,我想以如下方式使用它:

String expectedValue = "FooBarNonUtf8";
String actualValue = jsonReader.readFrom("file", "key"); //should parse non-UTF correctly
assertEquals(expectedValue, actualValue);

【问题讨论】:

  • 你对non UTF-8的定义是什么?
  • UTF-8 是一种字符编码。它将字符(没有任何编码)转换为字节。不确定“非 UTF-8 字符串”是什么意思,因为字符串包含字符,而不是字节。
  • 当然你需要将它构造为字节。检查这个问题:stackoverflow.com/questions/16031620/…
  • Java 本身中的字符串和字符始终是 UTF-16... 编码仅在转换为字节或从字节转换时才相关。你到底想达到什么目标?
  • @Eugene 这是一个实现细节。 String 的公共 API 允许获取字符,并且支持所有 Unicode 代码点。这些代码点如何在内部存储在这里并不重要。

标签: java utf-8


【解决方案1】:

在 C/C++ 编码的灾难之后(在历史上的那个时刻),Java 做出了以下设计决定:

  • String, char, Reader, Writer 用于处理 Unicode 文本,char 是 UTF-16,两个字节。
  • byte[], InputStream, OutputStream 用于二进制数据,给定一些编码/字符集,可以是文本。

所以你实际上只能滥用 String/char,而且几乎可以肯定会有损坏的数据(有些字符对于UTF-*有特殊的结构意义)。

解决方案是将二进制数据编码为例如 Base64。

byte[] b = ...
String s = Base64.getEncoder().encode(b);

有一些不同的编码器,您可以设置换行、填充等属性。

或者您可能更喜欢十六进制表示。

【讨论】:

    猜你喜欢
    • 2017-06-18
    • 1970-01-01
    • 2016-09-08
    • 2018-01-23
    • 2011-09-30
    • 2023-03-27
    • 2010-12-01
    • 2014-03-12
    • 2011-08-16
    相关资源
    最近更新 更多