UTF-8转 GBK问题

stormem 2012-06-13 02:44:19
如果 要转的字符串是 偶数就没问题,
如果 是奇数最后一个字就会变成 问号 (“?”)
网上搜了半天都是 JAVA 的解决方法。请问 .NET 该 怎么 正常转码?
...全文
666 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
.net 框架中有现成的方法,其解决方案简单的“令人发指”,所以没有什么人像搞java的人那样“事儿事儿”地去什么文章发布在网上。
personball 2012-12-01
  • 打赏
  • 举报
回复
utf8 一桶浆糊!gbk什么的烦死了
Easy2HJ 2012-12-01
  • 打赏
  • 举报
回复
楼上的方法可行的。
孟子E章 2012-06-14
  • 打赏
  • 举报
回复
如果这2个地方你都不能改,你可以在Global里面写这样的代码

public void Application_BeginRequest(object sender, EventArgs args)
{
Request.ContentEncoding = Encoding.GetEncoding("utf-8");
}

这样就可以正确接收到来自utf-8页面的内容了,无需再解码

测试

a.htm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<head>
<title></title>
</head>
<body>
<form method="post" action="a.aspx">
<input name="content" />
<input type="submit" />
</form>
</body>
</html>


a.aspx

<%@ Page Language="C#" Debug="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(Request.Form["content"]);
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<form runat="server"></form>
</body>
</html>


Global.asax
<%@ Application Language="C#" %>

<script runat="server">

public void Application_BeginRequest(object sender, EventArgs args)
{
Request.ContentEncoding = Encoding.GetEncoding("utf-8");
}
</script>



需要注意的是,这个是对所有页面的,你可能需要判断页面url是不是你要需要处理的页面。

另外,在国际环境下,使用
<globalization fileEncoding="gb2312" requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" />
不是好的做法
stormem 2012-06-13
  • 打赏
  • 举报
回复
所以 只能 把 获得 的 UTF-8 格式 的 字 转换成 GBK 。。
现在的问题就是 ,
转换 的时候 奇数 字符窜 最后一个 字符 就变成 ? 了
原因是
GBK编码是一个中文2个字节,而UTF-8编码是一个中文3个字节
但是 GBK.GetString(u8bytes); 这个 方法 每次读取2个字进行转换。
所以 奇数 字符串 会 剩下 一个字节 !所以 会出现 “?”

但是 我不知道 该 用 什么方法 解决这问题
stormem 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
不是没用,这是最简单的方法

你要是能控制输入页面,你可以改成gbk,
如果你不能控制输入页面,那如果可以控制接收页面,改成utf-8,
都根本不需要进行转换,

System.Text.Encoding.GetEncoding("GBK").GetString(System.Text.Encoding.UTF8.GetBytes("UTF-8字符串内容"))

Java中的ne……
[/Quote]

主要是 发送表单的html页面不能动 ,那页面 是 UTF-8 的 ,但 我项目 配置文件里有
<globalization fileEncoding="gb2312" requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" /> 是 GBK 的 两个 我都 不能 改。。。

孟子E章 2012-06-13
  • 打赏
  • 举报
回复
不是没用,这是最简单的方法

你要是能控制输入页面,你可以改成gbk,
如果你不能控制输入页面,那如果可以控制接收页面,改成utf-8,
都根本不需要进行转换,

System.Text.Encoding.GetEncoding("GBK").GetString(System.Text.Encoding.UTF8.GetBytes("UTF-8字符串内容"))

Java中的new String().getBytes()性质相同
stormem 2012-06-13
  • 打赏
  • 举报
回复
哎 净说些 没用的
孟子E章 2012-06-13
  • 打赏
  • 举报
回复
发邮箱,使用utf-8就可以了,不要使用gbk,
stormem 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

如果都是utf-8,其实不用任何转换都是可以的,web.config里面写
<globalization
requestEncoding="utf-8"
responseEncoding="utf-8"
/>

不要写gbk之类的
[/Quote]

不是啊。 。。我是要弄个 发送邮件的 东西!!
提交 表单后 后台获取 表单内容 发送到 邮箱里呀!
孟子E章 2012-06-13
  • 打赏
  • 举报
回复
如果都是utf-8,其实不用任何转换都是可以的,web.config里面写
<globalization
requestEncoding="utf-8"
responseEncoding="utf-8"
/>

不要写gbk之类的
stormem 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

转过啊,关键是你的内容真的是utf-8还是只是utf-8的url编码格式?
[/Quote]

这么 说吧 。。。。是一个 静态 的 页面 提交表单 然后 ASPX 页面 获取表单 内容
静态 页面 加了 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

aspx 页面 Request.Form[“”].ToString()得到的是乱码

经过
    public string str(string form)
{
string u16s = Request.Form[form].ToString().Trim();
Encoding GBK = Encoding.GetEncoding("GBK");
Encoding utf8 = Encoding.UTF8;
byte[] u16bytes = GBK.GetBytes(u16s);
byte[] u8bytes = Encoding.Convert(utf8, GBK, u16bytes);
string str = GBK.GetString(u8bytes);
return str;


}

后得到 的 是正常的 汉字 。。但有个问题
如果 汉字的 个数 是 奇数 则 最后 一位 是 “?”
孟子E章 2012-06-13
  • 打赏
  • 举报
回复
转过啊,关键是你的内容真的是utf-8还是只是utf-8的url编码格式?
stormem 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
System.Text.Encoding.GetEncoding("GBK").GetString(System.Text.Encoding.UTF8.GetBytes("UTF-8字符串内容"))
[/Quote]
你有这样转过么??
孟子E章 2012-06-13
  • 打赏
  • 举报
回复
System.Text.Encoding.GetEncoding("GBK").GetString(System.Text.Encoding.UTF8.GetBytes("UTF-8字符串内容"))

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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