作者fo40225 (靖)
标题Re: [问题] Big5 转 UTF-8
时间Fri Jun 19 21:54:17 2015
※ 引述《FT6034 (耐心等待)》之铭言:
: 事情是这样发展的...
: 主程式是外国人针对某游戏写的,透过API取得聊天室讯息
: 原程式储存资讯至 txt 档,编码是 UTF-8
: 输入 "测试" , txt 档里头记录 "皜祈岫" ,所以我猜测 args.Message 是 BIG5
问题很简单 原来的程式没有问题 是因为那个txt没有BOM所以记事本把档案当作Big5读取
现在你有两种做法
1. 档头加上BOM 其他程式码不变 通通不要带编码 这样.NET预设使用UTF-8写入档案
var stream = new StreamWriter(_path, true);
var stream = new StreamWriter(_path, true, Encoding.UTF8);
这两行是一样的
2. 指定使用Big5输出
var stream = new StreamWriter(_path, true, Encoding.GetEncoding(950));
这样该档案可以使用记事本正常读取
----
对於英文 使用ANSI与UTF-8出来的档案是一样的
UTF-8就是一个英语系用很爽 其他语系跳火圈的编码
http://www.csie.ntu.edu.tw/~p92005/Joel/Unicode.html
---
Game.OnChat内部是使用指标直接读取记忆体 并且没有指定编码 预设使用ANSI读
类似这样 new string((sbyte*)message)
而读取出来 你在Visual Studio 下中断点看到args.Message如果是正常的
表示已经正常读取并转换成UTF-16放在记忆体内
https://msdn.microsoft.com/zh-tw/library/cc488003.aspx
"在 C# 中,所有记忆体内的字串编码都是 Unicode (UTF-16)。
当您将资料从储存区带入 string 物件时,资料会自动转换成 UTF-16。
如果资料只包含 0 到 127 的 ASCII 值,您就不需要额外进行转换。
不过,如果原始程式文字包含延伸 ASCII 位元组值 (128 到 255),则预设会按照目前
的字码页 (Code Page) 来解译扩充字元。"
因为你的程式在中文Windows上跑 基本上这段不会有问题
剩下的问题就是这UTF-16怎麽输出的问题了
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.169.198.62
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1434722062.A.361.html
1F:→ FT6034: 谢谢指教,「UTF-16怎麽输出」我再研究看看@@" 06/20 09:36
2F:→ fo40225: 不要管UTF-16 那不是你该管的 你要做的是用最一开始会乱 06/20 11:23
3F:→ fo40225: 码的原始码 加上第二种解法就行了 06/20 11:24