Java UTF8编码

5

我有一个场景,其中一些特殊字符以系统默认编码存储在数据库(sybase)中,我必须使用Java程序获取此数据并将其以UTF-8编码发送给第三方。

有一个前提条件,发送到第三方的数据不应超过定义的最大大小。由于转换为UTF-8后,一个字符可能会被2或3个字符替换,因此我的逻辑是在从数据库获取数据后,必须将其编码为UTF-8字符串,然后拆分该字符串。以下是我的观察结果:

当遇到任何特殊字符,例如中文或希腊字符或任何ASCII 256之上的特殊字符时,当我将其转换为UTF-8时,一个字符可能由多个字节表示。

那么我怎样才能确定转换是否正确?对于转换,我正在使用以下内容:

// storing the data from database into string
string s = getdata from the database;

// converting all the data in byte array utf8 encoding
byte [] b = s.getBytes("UTF-8");

// creating a new string as my split logic is based on the string format

String newString = new String(b,"UTF-8");

但是,当我将这个新字符串输出到控制台时,特殊字符显示为?

所以我有一些疑问:

  • 如果我的转换逻辑有误,那么我应该如何进行更正。
  • 在将我的转换转换为UTF-8之后,我可以进行双重检查以确定我的转换是否正确吗?我的意思是,如果转换后的消息不可读,则说明转换存在问题,我假设发送给第三方的消息必须是可读的。

希望从所有专家那里得到一些观点。

如果需要更多信息,请告知我。


3
从我的理解来看,这似乎是由于您的控制台存在问题,而不是转换过程本身出了问题。您尝试过将其写入文本文件,然后使用文本编辑器打开吗?请注意,此处的转换过程指的是代码转换等操作。 - biziclop
1
你尝试过输出原始字符串吗?你的控制台使用的字体可能不包含这些字符。 - josefx
将Unicode转换为UTF-8并使字符正确显示的任务并非没有问题。去年,一个联系人找到了解决方案。我会问他是如何让它正常工作的。 - James P.
5个回答

2
你说你要将Unicode写入文本文件,但这需要将Unicode转换成其他编码格式。
但是,转换成什么呢?这取决于你如何打开文件。
例如,System.out.println(myUnicodeString)会将Unicode转换为System.out构造时使用的编码格式,很可能是你所在平台的默认编码格式。如果你正在运行Windows,则可能是windows-1252
如果你告诉Java在写入文件时使用UTF-8编码格式,那么你将得到一个包含UTF-8的文件:
PrintWriter pw = new PrintWriter(new FileOutputStream("filename.txt"), "UTF-8");
pw.println(myUnicodeString);

0

0

Java字符串是Unicode编码的,但并非所有Java组件都支持完全的Unicode字符串,特别是AWT组件和轻量级Swing组件。因此,您可能拥有完美的字符串,但在控制台输出中却得到垃圾信息。


0

感谢大家的回复。

正如你们中的一些人建议的那样,我已经尝试将其写入文本文件,但是在文本文件中,我的特殊字符也会出现问号。因此,我有以下观察结果:

a)编码是一个双重过程,首先您需要在字节级别上将字符串从一种编码转换为另一种编码,然后还必须拥有所需的字体以适应新的字符集。

b)如果我们对某个字符串进行编码,那么我们就是对字节进行编码。对于当前的情况,我正在使用 MS Word 中的双引号并将其插入到 Sybase 数据库中,然后在从数据库中获取数据后,我将其写入 txt 文件,在那里我得到了相同的问号,但是如果我直接从数据库中复制相同的内容到 MS Word 或 Edit Plus 中,我可以看到实际的字符。因此,我无法理解这个问题。据我所知,在编码期间,我们只应关注实际表示的字节值,而不是我们从这些字节数组构成的字符串对象。但是,除非我的编码信息不可读,否则其他人如何验证它并阅读它(我猜测这些人将阅读字节,但是如果在 utf8 编码时引入了类似于垃圾字符的问号,则不是信息丢失吗)。

非常感谢您对我的观察的看法,我应该采取什么正确的方法进一步处理呢?


1
“?”只是告诉你查看文本的程序也不开心。除非你查看比特位,否则你无法真正了解发生了什么。使用十六进制转储工具查看一些示例文本。 - ddyer

0

适用于正确的转换 - 这个是从 iso-8859-1 到 utf-8:

public String to_utf8(String fieldvalue) throws UnsupportedEncodingException{

        String fieldvalue_utf8 = new String(fieldvalue.getBytes("ISO-8859-1"), "UTF-8");
        return fieldvalue_utf8;
}

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