【问题标题】:Java UTF8 encodingJava UTF8 编码
【发布时间】:2011-01-17 19:54:05
【问题描述】:

我有一个场景,其中一些特殊字符以系统的默认编码存储在数据库 (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 转换为 utf-8 并让字符正确显示的任务并非没有问题。一位联系人去年找到了解决方案。我会问他是怎么做到的。

标签: java utf-8


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      感谢大家的回复..

      正如你们中的一些人所建议的那样,我已经尝试将它写入文本文件,但是在文本文件中我也得到了?对于我的特殊字符。所以我有以下观察:-

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

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

      非常感谢您对我的观察的看法以及我应该进一步遵循什么正确的方法?

      【讨论】:

      • 那个?只告诉你,你用来查看文本的程序也很不爽。在你看到这些位之前,你无法知道真正发生了什么。使用 hexdump 工具查看一些示例文本。
      【解决方案4】:

      请使用 hex-editor 来验证您的输出是否为正确的 UTF8 格式。没有其他方法可以确定您所看到的是否正确。

      如果您还没有准备好,请阅读此内容:http://www.joelonsoftware.com/articles/Unicode.html

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-04-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-17
          • 2012-08-24
          相关资源
          最近更新 更多