我如何检查是否一个字符串是有效的UTF-8格式?检查是否在Java中
回答
只有一个字节的数据可以进行检查。如果你构造了一个String,那么它已经在UTF-16内部。
另外仅字节数组可以是UTF-8编码。
这里是UTF-8转化的常见的情况。
String myString = "\u0048\u0065\u006C\u006C\u006F World";
System.out.println(myString);
byte[] myBytes = null;
try
{
myBytes = myString.getBytes("UTF-8");
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
System.exit(-1);
}
for (int i=0; i < myBytes.length; i++) {
System.out.println(myBytes[i]);
}
如果你不知道你的字节数组的编码,juniversalchardet是一个库,以帮助您检测它。 https://docs.oracle.com/javase/tutorial/i18n/text/string.html:
就像澄清一样,String的一个实例不是UTF-16编码形式,严格来说,因为它允许不合格的代码单元序列(以隔离的代理单元形式)。但是,它是一个Unicode 16位字符串。 –
更严格地说,Java String也不是真正的Unicode 16位字符串,因为它可以包含[surrogates](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/用于UCS4(3字节和4字节)字符的openjdk/6-b14/sun/nio/cs/Surrogate.java)。 – rustyx
ICU4J是另一个Java库,可以帮助您检测字节数组的编码:http://site.icu-project.org/ –
以下职位由可在官方Java教程拍摄。
的字符串转换程序开始通过创建包含 Unicode字符的字符串:
String original = new String("A" + "\u00ea" + "\u00f1" + "\u00fc" + "C");
打印时,命名为原来的字符串显示为:
AêñüC
到字符串对象转换为UTF -8,调用getBytes方法并且 指定适当的编码标识符作为参数。 getBytes方法返回UTF-8格式的字节数组。要从非Unicode字节的数组中创建 字符串对象,请使用编码参数调用字符串 构造函数。这使得这些 调用的代码被包含在try块,万一指定的编码是 不受支持:
try { byte[] utf8Bytes = original.getBytes("UTF8"); byte[] defaultBytes = original.getBytes(); String roundTrip = new String(utf8Bytes, "UTF8"); System.out.println("roundTrip = " + roundTrip); System.out.println(); printBytes(utf8Bytes, "utf8Bytes"); System.out.println(); printBytes(defaultBytes, "defaultBytes"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }
的字符串转换程序打印出在utf8Bytes值和 defaultBytes阵列展示了重要的一点:转换后的文本的长度可能与源 文本的长度不同。某些Unicode字符转换为单个字节,其他转换为 对或三字节的字节。 的printBytes方法通过调用byteToHex方法,它是在源文件中所定义, UnicodeFormatter.java显示字节数组。这里是printBytes方法:
public static void printBytes(byte[] array, String name) { for (int k = 0; k < array.length; k++) { System.out.println(name + "[" + k + "] = " + "0x" + UnicodeFormatter.byteToHex(array[k])); } }
printBytes方法的输出如下。请注意,只有第一 和最后一个字节,A和C的人物,都是一样的在两个数组:
utf8Bytes[0] = 0x41 utf8Bytes[1] = 0xc3 utf8Bytes[2] = 0xaa utf8Bytes[3] = 0xc3 utf8Bytes[4] = 0xb1 utf8Bytes[5] = 0xc3 utf8Bytes[6] = 0xbc utf8Bytes[7] = 0x43 defaultBytes[0] = 0x41 defaultBytes[1] = 0xea defaultBytes[2] = 0xf1 defaultBytes[3] = 0xfc defaultBytes[4] = 0x43
- 1. 检查XML标签是否在Java中
- 2. 检查Firebase中是否存在ID [Java]
- 3. 检查图像中是否存在Java
- 4. 检查java中是否存在字符
- 5. 检查Java中是否存在日期
- 6. java neo4j检查是否存在关系
- 7. 检查Java应用程序是否在
- 8. 安装前检查Java是否存在
- 9. Java Hibernate检查值是否存在
- 10. 如何检查是否在Java
- 11. 检查输入,看它是否在Java中是双精度的
- 12. Java - 如何检查在MySQL表中是否存在用户名
- 13. Java的DOM如何检查是否在XML中存在节点
- 14. 如何检查路径是否存在或不在java中?
- 15. 是否可以在java中进行“原子”中断检查?
- 16. 检查系统托盘是否集中在Java中?
- 17. Java检查文件是否为空:IOException:null
- 18. 检查Java是否安装了Bash
- 19. Java - 检查SqlSessionFactory是否有效
- 20. 检查java arraylist是否包含对象
- 21. Java - 检查是否parseInt抛出异常
- 22. Java - 变量检查是否包含
- 23. Java:检查PC是否空闲
- 24. 检查arraylist是否为空java
- 25. Java - 如何检查JFrame是否关闭
- 26. Java检查布尔值是否为空
- 27. 如何检查Java EE Singleton是否忙?
- 28. 检查属性是否存在与检查是否为空
- 29. 在PHP中检查URL是否存在
- 30. 方法来检查的CapsLock是否打开与否在Java
你的意思是字节[]的有效编码? – bestsss
最简单的事情可能是解码并重新编码。检查你得到同样的事情。几乎在每种情况下这都是正确的。 –
@Peter不会总是有效,因为某些字符可以用不同的字节序列编码。两个字节序列都是正确的,并且对相同的字符进行编码,但字节不同。 – Jesper