编码如何在Java中将十六进制转换为utf8编码的字符串 10 月,1 周 Questions & Answers 188 我有一个十六进制字符串,我正在尝试将其转换回utf-8编码字符串 例如: String hexString = "6a6f65"; 如何将上面的字符串转换回“joe”
# 1 楼答案 你不能可靠地做到这一点 Unicode字符可以在U+0000到U+10FFFF的任何代码点进行编码 因此,我们无法知道输入中一次有多少个字符应该被解析为Unicode代码点的十六进制数 子字符串>;代码点整数>StringBuilder#appendCodePoint>String 如果您确定输入应该一次解析两个字符,请使用String#substring检索每对字符。使用Integer.parse解析每一对 int codePoint = Integer.parseInt( hexInput ,16 ) ; 使用^{}建立结果 String hexString = "6a6f65"; StringBuilder builder = new StringBuilder(); for ( int i = 0 ; i < hexString.length() ; i += 2 ) { String substring = hexString.substring( i , i + 2 ); int codePoint = Integer.parseInt( substring , 16 ); builder.appendCodePoint( codePoint ); } String result = builder.toString(); 看到这个code run live at IdeOne.com. result = joe 警告:如果此类输入来自UTF-8编码文本,这种方法不可靠。这种文本可以使用1、2、3或4个八位字节的数据来表示任何一个字符。如果您的输入确实是UTF-8编码的文本,那么您应该对其进行解析 溪流 我并不建议在这种情况下这样做,但您可以使用streams StringBuilder builder = new StringBuilder(); String input = "6a6f65"; IntStream.iterate( 0 , ( x ) -> x < input.length() , i -> i + 2 ).forEach( i -> builder.appendCodePoint( Integer.parseInt( input.substring( i , i + 2 ) , 16 ) ) ); System.out.println( "builder = " + builder ); builder = joe
# 2 楼答案 如果可以确定十六进制字符串来自正确UTF-8编码字符串的字节数组,则只需执行以下操作: 将十六进制字符串转换回字节数组李> 将字节数组进一步转换回字符串,当然要使用正确的编码李> 第一部分,有多种方法可以做到这一点。看看this question然后挑一个适合你需要的 从十六进制字符串中获取字节数组后,请执行以下操作: String s = new String(bytearr, StandardCharsets.UTF_8);
# 1 楼答案
你不能可靠地做到这一点
Unicode字符可以在U+0000到U+10FFFF的任何代码点进行编码
因此,我们无法知道输入中一次有多少个字符应该被解析为Unicode代码点的十六进制数
子字符串>;代码点整数>
StringBuilder#appendCodePoint
>String
如果您确定输入应该一次解析两个字符,请使用
String#substring
检索每对字符。使用Integer.parse
解析每一对使用^{} 建立结果
看到这个code run live at IdeOne.com.
警告:如果此类输入来自UTF-8编码文本,这种方法不可靠。这种文本可以使用1、2、3或4个八位字节的数据来表示任何一个字符。如果您的输入确实是UTF-8编码的文本,那么您应该对其进行解析
溪流
我并不建议在这种情况下这样做,但您可以使用streams
# 2 楼答案
如果可以确定十六进制字符串来自正确UTF-8编码字符串的字节数组,则只需执行以下操作:
第一部分,有多种方法可以做到这一点。看看this question然后挑一个适合你需要的
从十六进制字符串中获取字节数组后,请执行以下操作: