Jenney Zhao

导航

< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

统计

2015年11月23日 #

联通编码问题

(部分转自http://www.cnblogs.com/hongfei/p/3648794.html

当我们在 windows 的记事本里新建一个文件,输入"联通"两个字之后,保存,关闭,然后再次打开,会发现这两个字已经消失了,代之的是几个乱码!其实这是因为GB2312编码与UTF8编码产生了编码冲撞的原因。

当你新建一个文本文件时,记事本的编码默认是ANSI, 如果你在ANSI的编码输入汉字,那么他实际就是GB系列的编码方式,在这种编码下,"联通"的内码是:

c1 1100 0001

aa 1010 1010

cd 1100 1101

a8 1010 1000

注意到了吗?第一二个字节、第三四个字节的起始部分的都是"110"和"10",正好与UTF8规则里的两字节模板是一致的,于是再次打开记事本时,记事本就误认为这是一个UTF8编码的文件,让我们把第一个字节的110和第二个字节的10去掉,我们就得到了"00001 101010",再把各位对齐,补上前导的0,就得到了"0000 0000 0110 1010",不好意思,这是UNICODE的006A,也就是小写的字母"j",而之后的两字节用UTF8解码之后是0368,这个字符什么也不是。这就是只有"联通"两个字的文件没有办法在记事本里正常显示的原因。 

而如果你在"联通"之后多输入几个字,其他的字的编码不见得又恰好是110和10开始的字节,这样再次打开时,记事本就不会坚持这是一个utf8编码的文件,而会用ANSI的方式解读之,这时乱码又不出现了。

下面的例子里有3个文本文件,里面都含有汉字的"联通"二字,只是他们的编码方式不同:

liantong_GB2312.txt: GB2312格式

liantong_UTF8_withBOM.txt: UTF8 with BOM格式

liantong_UTF8_withoutBOM.txt: UTF8 without BOM格式

关于BOM的含义,详见https://en.wikipedia.org/wiki/Byte_order_mark。
请注意其中的一句话:
Despite the simplicity of detecting UTF-8, Microsoft compilers and interpreters, and many pieces of software on Microsoft Windows such as Notepad will not correctly read UTF-8 text unless it has only ASCII characters or it starts with the BOM. These tools add a BOM when saving text as UTF-8. Google Docs adds a BOM when converting a Microsoft Word document to plain text file for download.
static void Main(string[] args)
        {
            byte[] ltBytes = ReadAsBinary(".\\liantong_GB2312.txt");
            Console.Write("\"lian tong in GB2312\" bytes: ");
            PrintByteArray(ltBytes);
            Console.WriteLine();
            Encoding gb2312 = Encoding.GetEncoding(936);
            string gbStr = gb2312.GetString(ltBytes);
            Console.WriteLine("\"GB2312 encoded\" string: {0}", gbStr);
            string utf8Str = Encoding.UTF8.GetString(ltBytes);
            Console.WriteLine("\"UTF8 endcoded\" string: {0}", utf8Str);

            byte[] ltUtf8BOMBytes = ReadAsBinary(".\\liantong_UTF8_withBOM.txt");
            Console.Write("\"lian tong in UTF8 with BOM\" bytes: ");
            PrintByteArray(ltUtf8BOMBytes);
            Console.WriteLine();
            string utf8BOMStr = Encoding.UTF8.GetString(ltUtf8BOMBytes);
            Console.WriteLine("\"UTF8 with BOM endcoded\" string: {0}", utf8BOMStr);
            utf8Str = Encoding.UTF8.GetString(ltUtf8BOMBytes, 3, 6);
            Console.WriteLine("\"UTF8 with BOM removed endcoded\" string: {0}", utf8Str);

            byte[] ltUtf8noBOMBytes = ReadAsBinary(".\\liantong_UTF8_withoutBOM.txt");
            Console.Write("\"lian tong in UTF8 withOUT BOM\" bytes: ");
            PrintByteArray(ltUtf8noBOMBytes);
            Console.WriteLine();
            string utf8noBOMStr = Encoding.UTF8.GetString(ltUtf8noBOMBytes);
            Console.WriteLine("\"UTF8 withOUT BOM endcoded\" string: {0}", utf8noBOMStr);
         }

        private static byte[] ReadAsBinary(string path)
        {
            FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read);
            BinaryReader breader = new BinaryReader(fs);
            byte[] bytes = breader.ReadBytes(1024);
            return bytes;
        }
        private static void PrintByteArray(byte[] barray)
        {
            foreach (byte tb in barray)
            {
                Console.Write(tb + " ");
            }
        }
    }

输出:

结论

The UTF-8 representation of the BOM is the byte sequence 0xEF,0xBB,0xBF,正好对应了239 187 191这3个byte。

posted @ 2015-11-23 14:05 Jenney Zhao 阅读(719) 评论(0) 推荐(0) 编辑

2015年11月19日 #

远程启动程序

摘要: 背景昨天遇到一个问题:本地电脑(Win7 x64)想要远程启动另一台电脑(Windows Server 2012 R2)上的一个程序(为*.exe程序),要求是:在不改变远程电脑配置的前提下,被启动的程序能弹出console界面,并有run as administrator的效果(类似于右击某个程序... 阅读全文

posted @ 2015-11-19 00:26 Jenney Zhao 阅读(3472) 评论(0) 推荐(0) 编辑

2015年11月13日 #

创业前必须要知道的几件事

摘要: 现在人人都想创业,都想一夜暴富,不管目的怎么样,但在真正创业前,有认真思考过下面的几件事儿吗? (听了Director Gene Bond的讲座有感,摘抄自他的slides)1. A very Big problem创业的目的是要解决一个大问题。什么问题算大,什么问题算小,仁者见仁,智者见智,但下面... 阅读全文

posted @ 2015-11-13 19:13 Jenney Zhao 阅读(204) 评论(0) 推荐(0) 编辑

2014年3月7日 #

Sysinternals Suite

摘要: http://technet.microsoft.com/en-us/sysinternals/bb842062The Sysinternals Troubleshooting Utilities have been rolled up into a single Suite of tools. This file contains the individual troubleshooting tools and help files. It does not contain non-troubleshooting tools like the BSOD Screen Saver or Not 阅读全文

posted @ 2014-03-07 19:50 Jenney Zhao 阅读(223) 评论(0) 推荐(0) 编辑

2013年10月11日 #

扩展Visual Studio Test Project:自定义TestClassAttribute - part 2

摘要: [转] http://blogs.msdn.com/b/vstsqualitytools/archive/2009/09/04/extending-the-visual-studio-unit-test-type-part-2.aspx代码下载地址:http://archive.msdn.microsoft.com/UnitTestExtendSample/Release/ProjectReleases.aspx?ReleaseId=4030In part 1, we introduced Unit Test Type Extensibility, highlighting the main 阅读全文

posted @ 2013-10-11 16:16 Jenney Zhao 阅读(457) 评论(0) 推荐(0) 编辑

扩展Visual Studio Test Project:自定义TestClassAttribute - part 1

摘要: 背景使用Visual Studio 2010 Test Project创建我们的automation test case时,预定义的TestClassAttribute可能会有以下局限:假设某些automation test case要求在version 1.0下跑;某些要求在version 1.1下跑,或在不同的环境下执行不同的case,预定义的TestClassAttribute不能在运行中自动决定某些case是否可以run,某些是否不能run(至少现在我没找到解决方法)。但Microsoft提供了一些类库可供我们自定义TestClassAttribute,从而实现以上目的。[转]http 阅读全文

posted @ 2013-10-11 15:12 Jenney Zhao 阅读(910) 评论(0) 推荐(0) 编辑

2013年8月22日 #

SQL Server Single-user Mode

摘要: 背景系统管理员可能会由于下列原因之一失去对 SQL Server 实例的访问权限:作为 sysadmin 固定服务器角色成员的所有登录名都已经被误删除。作为 sysadmin 固定服务器角色成员的所有 Windows 组都已经被误删除。作为 sysadmin 固定服务器角色成员的登录名用于已经离开公司或者无法找到的个人。sa 帐户被禁用或者没有人知道密码。作为系统管理员如何可以重新获得对 SQL Server 数据库引擎的访问权限?可以让您重新获得访问权限的一种方法是重新安装 SQL Server 并将所有数据库附加到新实例。这种解决方案很耗时,并且若要恢复登录名,可能还需要从备份中还原 ma 阅读全文

posted @ 2013-08-22 14:34 Jenney Zhao 阅读(1223) 评论(0) 推荐(0) 编辑

2013年8月20日 #

MAXDOP(max degree of parallelism)

摘要: 概述当 SQL Server 在具有多个微处理器或 CPU 的计算机上运行时,它将为每个并行计划执行检测最佳并行度(即运行一个语句所使用的处理器数)。您可以使用 max degree of parallelism 选项来限制执行并行计划时所用的处理器数量。若要使服务器能够确定最大并行度,请将此选项设置为默认值 0。若将 maximum degree of parallelism 设置为 0,SQL Server 将能够使用至多 64 个可用的处理器。若要取消生成并行计划,请将 max degree of parallelism 设置为 1。将该值设置为大于 1 的数值来限制执行单个并行查询时所 阅读全文

posted @ 2013-08-20 14:14 Jenney Zhao 阅读(864) 评论(0) 推荐(0) 编辑

2013年8月4日 #

关于log4net

摘要: 1概述log4net is a tool to help the programmer output log statements to a variety of output targets.关于log4net详细的介绍请参见:http://logging.apache.org/log4net/release/features.htmlhttp://logging.apache.org/log4net/release/manual/introduction.html优点:It allows the developer to control which log statements are o 阅读全文

posted @ 2013-08-04 22:43 Jenney Zhao 阅读(501) 评论(0) 推荐(0) 编辑

2013年5月14日 #

iisreset

摘要: IISRESET.EXE (c) Microsoft Corp. 1998-2005Usage: iisreset [computername]/RESTART Stop and then restart all Internet services. /START Start all Internet services. /STOP Stop all Internet services. /REBOOT Reboot the computer. /REBOOTONERROR Reboot the computer if an error occurs when starting... 阅读全文

posted @ 2013-05-14 12:49 Jenney Zhao 阅读(388) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示