记事本打开后,然后把它保存为utf8格式的问题,双字节和单字节的问题,请求帮助。

时间:2023-01-05 14:39:54


有个问题请教:
本地有个文本文件,你用记事本打开后,然后把它保存为utf8格式(保存的格式很多,打开记事本可以看看),
另外你用其他编辑器打开原来的文件,例如uedit,然后再保存为utf8格式,
正常认为这两个保存的utf8文件是一样,
但是这两个文件不一样,前者保存的文件是双字节的,后者是单字节的
请问有什么办法来控制马?

utf8还分签名和非签名两种
其中非签名的是存单字节的,那么怎么样才能统一呢
简单的例子:
你写一个文本:123样例
你保存成记事本中的可以保存的文件,下面以utf8举例
你保存的这个文件,你用程序上传服务器,通常的是INPUT FILE那个控件,
当你上传到服务器后,你会发现:123样例中的1的长度是2,也就是双字节造成的
如果你不用记事本编辑,用uedit编辑,保存utf8,这样他默认的单字节,
上传后,你会发现:123样例中的1的长度是1
你不能保证用户用什么编辑器,
请问,一般这种情况怎么解决呢


欢迎讨论,谢谢。

20 个解决方案

#1


没细究过,和你一起关注

#2


推荐你看一下webcast里邵志东讲的那个asp.net编码课程!

大概还是要做转换的吧?

#3


jf算了

#4


帮你顶了

#5


通过notepad和uedit存相同内容后在本地是否一样呢

#6


是不是在C#里作一下转换?utf8的中文字符是占3个字符么?

#7


造成这个现象,明显不应该是你程序应该处理的,因为你也说了inputfile无法分辨文件的来源,到底是通过notepad编写还是uedit编写,它只是按照保留文件原样上传到服务器中。由此可见造成文件差异的原因是对相同内容编写,notepad所产生的文件不同于uedit所产生的,至少在文件头上可能是不同的。

#8


up

#9


Knight94(愚翁) ( ) 信誉:110  2006-08-23 08:11:00  得分: 0  
 
 
   造成这个现象,明显不应该是你程序应该处理的,因为你也说了inputfile无法分辨文件的来源,到底是通过notepad编写还是uedit编写,它只是按照保留文件原样上传到服务器中。由此可见造成文件差异的原因是对相同内容编写,notepad所产生的文件不同于uedit所产生的,至少在文件头上可能是不同的。
  
 
文件头会有两个字节来记录文件的格式的(我猜得,估计那就是纪录文件格式,呵呵),
有什么方法来根据那两个字节判断是什么格式呢?
那就可以在程序中解析了

#10


这个感觉做一个编辑器阿,不是做业务程序

#11


mark

#12


帮顶

#13


utf8 对ascII是单字节存储,后边的双字节,汉字三字节。:)

#14


to 文件头会有两个字节来记录文件的格式的(我猜得,估计那就是纪录文件格式,呵呵),
有什么方法来根据那两个字节判断是什么格式呢?
那就可以在程序中解析了

你可以通过如下的方式来判断一下Encoding具体是什么
using( StreamReader sr = new StreamReader( yourFile ) )
{
     Debug.WriteLine( sr.CurrentEncoding.EncodingName );
}

#15


InputStreamReader isr=new InputStreamReader(in);
isr.getEncoding()

java中是这样吗

#16


to java中是这样吗

java我不熟
:(

#17


目前我的解决方法是这样的,读的时候bytes,一旦发现前两个字节是负数的话,就跳过去,不读,编码改称utf-8,呵呵,这样就没问题,
因为正常情况下,byte都是正数,只有最前面的是标志,是负数。

#18


用using( StreamReader sr = new StreamReader( yourFile ) )
{
     Debug.WriteLine( sr.CurrentEncoding.EncodingName );
}
读的话,是机器默认的编码ms932,对于文件的保存编码还是不可以。
不过还是谢谢哦,目前还是跳过不读,呵呵

#19


如果存的时候都采用unicode呢,是否要简便些

#20


window下转是有可能产生乱码的,但是在window下看不到.
到unix下打开该文件可以看到文件乱码.

#1


没细究过,和你一起关注

#2


推荐你看一下webcast里邵志东讲的那个asp.net编码课程!

大概还是要做转换的吧?

#3


jf算了

#4


帮你顶了

#5


通过notepad和uedit存相同内容后在本地是否一样呢

#6


是不是在C#里作一下转换?utf8的中文字符是占3个字符么?

#7


造成这个现象,明显不应该是你程序应该处理的,因为你也说了inputfile无法分辨文件的来源,到底是通过notepad编写还是uedit编写,它只是按照保留文件原样上传到服务器中。由此可见造成文件差异的原因是对相同内容编写,notepad所产生的文件不同于uedit所产生的,至少在文件头上可能是不同的。

#8


up

#9


Knight94(愚翁) ( ) 信誉:110  2006-08-23 08:11:00  得分: 0  
 
 
   造成这个现象,明显不应该是你程序应该处理的,因为你也说了inputfile无法分辨文件的来源,到底是通过notepad编写还是uedit编写,它只是按照保留文件原样上传到服务器中。由此可见造成文件差异的原因是对相同内容编写,notepad所产生的文件不同于uedit所产生的,至少在文件头上可能是不同的。
  
 
文件头会有两个字节来记录文件的格式的(我猜得,估计那就是纪录文件格式,呵呵),
有什么方法来根据那两个字节判断是什么格式呢?
那就可以在程序中解析了

#10


这个感觉做一个编辑器阿,不是做业务程序

#11


mark

#12


帮顶

#13


utf8 对ascII是单字节存储,后边的双字节,汉字三字节。:)

#14


to 文件头会有两个字节来记录文件的格式的(我猜得,估计那就是纪录文件格式,呵呵),
有什么方法来根据那两个字节判断是什么格式呢?
那就可以在程序中解析了

你可以通过如下的方式来判断一下Encoding具体是什么
using( StreamReader sr = new StreamReader( yourFile ) )
{
     Debug.WriteLine( sr.CurrentEncoding.EncodingName );
}

#15


InputStreamReader isr=new InputStreamReader(in);
isr.getEncoding()

java中是这样吗

#16


to java中是这样吗

java我不熟
:(

#17


目前我的解决方法是这样的,读的时候bytes,一旦发现前两个字节是负数的话,就跳过去,不读,编码改称utf-8,呵呵,这样就没问题,
因为正常情况下,byte都是正数,只有最前面的是标志,是负数。

#18


用using( StreamReader sr = new StreamReader( yourFile ) )
{
     Debug.WriteLine( sr.CurrentEncoding.EncodingName );
}
读的话,是机器默认的编码ms932,对于文件的保存编码还是不可以。
不过还是谢谢哦,目前还是跳过不读,呵呵

#19


如果存的时候都采用unicode呢,是否要简便些

#20


window下转是有可能产生乱码的,但是在window下看不到.
到unix下打开该文件可以看到文件乱码.

#21