繁体   English   中英

Java UTF8编码

[英]Java UTF8 encoding

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

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

当遇到任何特殊字符,如中文或希腊字符或任何特殊字符> ASCII 256时,当我将其转换为UTF-8时,单个字符可能由超过1个字节表示。

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

// 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");

但是当我将这个newString输出到控制台时,我得到了? 对于特殊字符。

所以我有些疑惑:

  • 如果我的转换逻辑错误,那我怎么能纠正它。
  • 转换为UTF-8后,我可以仔细检查我的转换是否正常? 我的意思是它是需要发送给第三方的正确消息,我假设如果消息在转换后不是用户可读的,那么转换有一些问题。

希望得到所有专家的一些观点。

如果我方需要进一步的信息,请告诉我。

您说您正在将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);

请使用十六进制编辑器验证您的输出是否格式正确UTF8。 没有其他方法可以确定您所看到的是否是校正器。

如果你还没准备好,请阅读: http//www.joelonsoftware.com/articles/Unicode.html

使用它进行正确的转换 - 这个是从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;
}

Java字符串是unicode,但并非所有java组件都支持完整的unicode字符串,尤其是AWT组件和轻量级swing组件。 所以你可能有完美的字符串,但在你的控制台输出中得到垃圾。

谢谢大家的回复..

正如你们中的一些人所建议的,我已经尝试将其写入文本文件,但是在文本文件中我也得到了吗? 为了我的特殊人物。 所以我有以下观察: -

a)编码是一个双重过程,首先你在字节级别将字符串从一个编码更改为另一个编码,然后你还必须拥有新字符集所需的字体。

b)如果我们编码一些字符串意味着我们正在编码字节,对于当前场景,我使用MS字中的双引号然后插入到sybase数据库中,并且在从db获取数据后,我正在写它到一个txt文件,我得到相同的? 对于双引号,但是如果我直接将相同的东西从db复制到MS字或编辑加上我可以看到实际的字符。 所以我无法理解这个问题。 根据我的理解,在编码过程中我们应该只关注字节值是真正的表示而不是我们用这些字节数组构成的字符串对象。但是,除非我的编码信息不是人类可读的,否则其他方可以验证它并读取它(我猜这些将是读取字节,但如果对于一个特殊字符有些?像utf8编码引入了垃圾字符,那么不是信息丢失)。

非常感谢您对我观察的看法以及我应该采取哪些正确的方法?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM