求一字符串x(标题过短的设定怎么这么郁闷)

deprecatedgb 2008-06-23 04:41:40
有语句
String input = new String(x.getBytes("utf-8"),"gbk");

结果: "三只小熊".equals(input) == true;
求字符串x

如有其它情况 也请说明 谢谢
...全文
1694 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
tulugan 2009-08-25
  • 打赏
  • 举报
回复
请问为什么UTF-8解码不出来却要去改变原字节数据?这样设计的目的是何?
tulugan 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 bao110908 的回复:]

先从第一个字节 C8 开始看,C8 只能匹配第二行的转换,也就是采用两个字节,
这时第一个字节匹配成功,再匹配后一个字节 FD,规范要求的第二个字节是
10xxxxxx 因此 C8 FD 转换失败,C8 这时采用 UTF-8 的缺失字符 EF BF BD 即
Unicode 的 U+FFFD 来替换,在我们的平台上显示为 ? 了。

[/Quote]

请把这段讲详细写吧,看了几遍,还是看不懂啊。
talent_marquis 2008-06-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 bao110908 的回复:]
不存在这种样子的 UTF-8 字符!

首先“三只小熊”的 GBK 编码为:C8FD D6BB D0A1 D0DC

拆成字节为:C8 FD D6 BB D0 A1 D0 DC

根据 Unicode 与 UTF-8 编码转换规则:

Java code
Unicode Code UTF-8 Code
0000~007F 0xxxxxxx
0080~07FF 110xxxxx 10xxxxxx
0800~FFFF 1110xxxx 10xxxxxx 10xxxxxx
10000~10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx



先从第一个字节 C8 开始看,…
[/Quote]

拜服!!
  • 打赏
  • 举报
回复
不存在这种样子的 UTF-8 字符!

首先“三只小熊”的 GBK 编码为:C8FD D6BB D0A1 D0DC

拆成字节为:C8 FD D6 BB D0 A1 D0 DC

根据 Unicode 与 UTF-8 编码转换规则:

Unicode Code UTF-8 Code
0000~007F 0xxxxxxx
0080~07FF 110xxxxx 10xxxxxx
0800~FFFF 1110xxxx 10xxxxxx 10xxxxxx
10000~10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx


先从第一个字节 C8 开始看,C8 只能匹配第二行的转换,也就是采用两个字节,
这时第一个字节匹配成功,再匹配后一个字节 FD,规范要求的第二个字节是
10xxxxxx 因此 C8 FD 转换失败,C8 这时采用 UTF-8 的缺失字符 EF BF BD 即
Unicode 的 U+FFFD 来替换,在我们的平台上显示为 ? 了。

关于 U+FFFD,Unicode 的描述是:
Replacement Character. A character used as a substitute for an uninterpretable
character from another encoding. The Unicode Standard uses U+FFFD replacement
character for this function.

同理 FD 以及最后两个 D0 DC 也都不能进行转换,都被 EF BF BD 所替代。

其中的 D6 BB 和 D0 A1 可以转换

D6 BB 二进制数据为:11010110 10111011 正好能匹配 UTF-8 的双字节,
去掉附加位为:10110 111011 再将其四位一组分开,即:0101 1011 1011
这个也就是 Unicode 字符的 U+05BB 编码。

这些编码可以到 Unicode 官方网站的数据库里查到:
http://www.unicode.org/cgi-bin/GetUnihanData.pl

同理,D0 A1 可以转成 Unicode 字符的 U+0421。

由于 U+05BB 在 GBK 平台上没办法显示出来,因此根据系统规范也显示成为 ?(可能有些机器能够正常显示)
U+0421 是个像 C 一样的字符,而 U+FFFD 则全部显示为 ?。

由于 C8FD D6BB D0A1 D0DC 在 UTF-8 编码中并没有完全对应的字符,因此“三只小熊”的这个问题无解!

这种词肯定是有的,但是非常难凑,得使用 GBK 编码表根据 UTF-8 的编码规范来找。

deprecatedgb 2008-06-24
  • 打赏
  • 举报
回复
String bears = "三只小熊"; 
String x = new String(bears.getBytes("gbk"),"utf-8");
System.out.println(x);
String result = new String( x.getBytes("utf-8"), "gbk" );
System.out.println( "三只小熊".equals( result ));


试过了 答案是
�ֻС��
false


这样不对哦
nec_copy 2008-06-24
  • 打赏
  • 举报
回复
deprecatedgb 2008-06-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 talent_marquis 的回复:]
Java code
public class TestEncodingString
{

public static void main( String[] args ) throws UnsupportedEncodingException
{
String bears = "三只小熊";
String x = new String(bears.getBytes("gbk"),"utf-8");
String result = new String( x.getBytes("utf-8"), "gbk" );
System.out.println( "三只小熊".equals( x ));
}

}




注意编译环境,也就是…
[/Quote]
这样运行,也设了gbk 貌似不行
String bears = "三只小熊";
String x = new String(bears.getBytes("gbk"), "utf-8");
System.out.println(x);
String result = new String(x.getBytes("utf-8"), "gbk");
System.out.println("三只小熊".equals(result));

结果:
��ֻС��
false
deprecatedgb 2008-06-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 bao110908 的回复:]
不存在这种样子的 UTF-8 字符!

首先“三只小熊”的 GBK 编码为:C8FD D6BB D0A1 D0DC

拆成字节为:C8 FD D6 BB D0 A1 D0 DC

根据 Unicode 与 UTF-8 编码转换规则:

Java code
Unicode Code UTF-8 Code
0000~007F 0xxxxxxx
0080~07FF 110xxxxx 10xxxxxx
0800~FFFF 1110xxxx 10xxxxxx 10xxxxxx
10000~10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx



先从第一个字节 C8 开始看,…
[/Quote]
听君一席话 胜读n年书
您的精研精神非常值得我学习
拜谢了 一点小分 不成敬意 以后发了 再来厚报
也感谢其他朋友 不过分我集中给了
deprecatedgb 2008-06-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 talent_marquis 的回复:]
Java code
public class TestEncodingString
{

public static void main( String[] args ) throws UnsupportedEncodingException
{
String bears = "三只小熊";
String x = new String(bears.getBytes("gbk"),"utf-8");
String result = new String( x.getBytes("utf-8"), "gbk" );
System.out.println( "三只小熊".equals( x ));
}

}




注意编译环境,也就是…
[/Quote]
这样试过吗?我现在不能编译 我逆算过 好象求不出想要的解
hemaily 2008-06-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cnoolon 的回复:]
楼主注意一点,gbk中一个中文是二个字符,而在utf-8是三个
[/Quote]
logi22 2008-06-23
  • 打赏
  • 举报
回复
3L怎么让那4个字的编码是gbk
我utf-8的工程是false的
cnoolon 2008-06-23
  • 打赏
  • 举报
回复
楼主注意一点,gbk中一个中文是二个字符,而在utf-8是三个
talent_marquis 2008-06-23
  • 打赏
  • 举报
回复

public class TestEncodingString
{

public static void main( String[] args ) throws UnsupportedEncodingException
{
String bears = "三只小熊";
String x = new String(bears.getBytes("gbk"),"utf-8");
String result = new String( x.getBytes("utf-8"), "gbk" );
System.out.println( "三只小熊".equals( x ));
}

}


注意编译环境,也就是上文三只小熊这四个字的编码要是gbk
cnoolon 2008-06-23
  • 打赏
  • 举报
回复
看你的代码是要将x用utf-8编码,然后用gbk解码,然后赋值给input

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧