当我用两个不同的项目运行下面的代码时,我得到不同的输出。
String myString = "Türkçe Karakter Testi : ?ü?iöç?Ü??ÇÖ?";
String value = new String(myString.getBytes("UTF-8"));
System.out.println(value);
Run Code Online (Sandbox Code Playgroud)
第一个项目是在 Netbeans 8.2 中创建的非 maven java 应用程序。它给了我我期望的以下结果。
“Türkçe Karakter Testi : ?ü?iöç?Ü??ÇÖ?”
第二个项目是 maven java 应用程序项目,它以与以下 pom.xml 文件相同的方式创建:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany</groupId>
<artifactId>mavenproject1</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
</project>
Run Code Online (Sandbox Code Playgroud)
这个项目给了我:
"Türkçe Karakter Testi : ğüşiöçÄ?ÜİÅ?ÇÖÄ?”
我用记事本++检查了两个文件,它们都用UTF-8编码
您缺少new String()构造函数中的编码,因此它使用的是您平台的默认编码,而不是 UTF-8(看起来像 的某种变体ISO-8859-1)。
如果您使用以下代码(这没有多大意义,但显示了默认编码拙劣的东西),您会看到它在任何地方都正确打印。
String myString = "Türkçe Karakter Testi : ?ü?iöç?Ü??ÇÖ?";
String value = new String(myString.getBytes("UTF-8"), "UTF-8");
System.out.println(value);
Run Code Online (Sandbox Code Playgroud)
这里有什么教训?在处理byte/character转换时始终指定要使用的编码!这包括诸如String.getBytes()、new String()和 之类的方法 new InputStreamReader()。
这只是字符编码在背后咬你的众多方式之一。这似乎是一个简单的问题,但它一直让毫无戒心的开发人员陷入困境。
| 归档时间: |
|
| 查看次数: |
1980 次 |
| 最近记录: |