| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1417 人关注过本帖
标题:高人们来解答下。C读入和输出中文的问题。
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
3楼的程序大体是可行的,只是没有考虑断行把敏感词分隔开导致遗漏的问题。按这个设计思路,把修改写回原来的文件也不会难,用堆分配足够的内存读入整个文件,在内存中处理后再写回去就是了。如果内存受限,就只能用临时文件中转。不过这些手续,让楼主自己做吧。

授人以渔,不授人以鱼。
2011-08-26 19:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:5 
这是我以前给过的判断ASCII字符和汉字字符的函数,供参考
程序代码:
// 检测是否ASCII字符
 bool inline GET::IsAscii(const wchar_t Character)

 {
     return ((Character >= 0x0020) && (Character <= 0x007E)) || ((Character >= 0xF900) && (Character <= 0xFA2D));

 }

// 检测是否汉字
 bool inline GET::IsHz(const wchar_t Character)

 {
     return (Character >= 0x4E00) && (Character <= 0x9FA5);

 }

 


[ 本帖最后由 TonyDeng 于 2011-8-26 20:18 编辑 ]

授人以渔,不授人以鱼。
2011-08-26 20:17
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
以下是引用TonyDeng在2011-8-26 20:17:20的发言:

// 检测是否ASCII字符
 bool inline GET::IsAscii(const wchar_t Character)
 {
     return ((Character >= 0x0020) && (Character <= 0x007E)) || ((Character >= 0xF900) && (Character <= 0xFA2D));
 }

// 检测是否汉字
 bool inline GET::IsHz(const wchar_t Character)
 {
     return (Character >= 0x4E00) && (Character <= 0x9FA5);
 }
 


考虑过UTF8吗?

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2011-08-26 20:25
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 13楼 御坂美琴
不考虑UTF8,Unicode全双字节码是Windows操作系统内部的编码,对C程序设计来说,不对外,写网页时才要考虑读写外部文件编码,那与程序自身处理无关(读进来后也一样用2字节码处理),事实上Windows在操作系统层级也要把各种编码转为Unicode双字节码,这种消耗是不可避免的,与其如此,一开始就致力原始编码格式。

处理UTF8,跟处理ANSI没什么本质差异,都要先判断字符性质决定下一个、两个字符的用法。凡是处理过这类问题的程序员,都不会困惑于字符串中间出现0数值(被传统C语法当作字符串结束)。楼主开始的问题,问怎么用二进制处理汉字,就极可能是碰到Unicode编码的0值被截断了字符串,不然不会那么问的。

传统ANSI编码,凡是高位为1的字符,视为双字节汉字,此时必须继续读入下一个byte,与当前的字符连在一起构成整体。如果高位为0,就是普通单字符。同样,UTF8之类,也有它自己的变长法则,按照编码规定做就是了。Windows采用完全双字节编码,省掉了很多麻烦,虽然字符串占用内存多了,但代码占用的资源少了。

12楼的代码,是在Windows控制台中通过键盘按键读入数据的例程,操作系统给我们的就是Unicode编码,不是别的,所以只需那样处理。如果从外部文件读入,需要试算分析它是什么编码,但没有绝对能判断正确的方法,因此网页文件才要一开始声明自己是什么编码。


[ 本帖最后由 TonyDeng 于 2011-8-26 20:53 编辑 ]

授人以渔,不授人以鱼。
2011-08-26 20:46
luyi_footman
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:32
专家分:100
注 册:2011-7-14
收藏
得分:0 
回复 11楼 TonyDeng
你好,你所说的断行把敏感词分开导致遗漏这句话我不是很明白,在文件IO操作里你的buffer里有多少他就写多少,无所谓断行与否,
我们打开文件时所看到的换行无非是两种情况,1是本身就是一个换行符,2就是你所用的应用程序处理了,使得显示出来有换行,其实
在数据里是没有这个换行符的。你后面说的在内存开辟足够的空间把数据在内存中改好后再一次性写回到文件中去,这种方法是可行的,
但是太暴力了,如果是做嵌入式开发,这种方法不应该推荐。

天道酬勤!
2011-08-26 20:51
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 15楼 luyi_footman
楼主给出的文件本身就有断行,而且写文件的人手工回车断行控制格式也相当正常。我说的是,如果要不遗漏敏感词被换行分隔(或者被人刻意用空格之类分隔避开识别),最好把这些分隔符过滤掉再处理。

至于你说的暴力,在Windows下这不算什么太暴力的行为,因为Windows容许处理2G的文件,而且这种处理手段是使用虚拟内存的,实际上文件根本不是被全部读入物理内存,而是仍在原来的位置没动,但操作系统建立映射把这个文件射到内存中了,对程序来说,它是不知道的。事实上,比2GB更大的文件也能这样处理。

授人以渔,不授人以鱼。
2011-08-26 21:01
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.">
<html xmlns="http://www.">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>C语言论坛 - 编程论坛</title>
<link rel="shortcut icon" href="http://bbs.bccn.net/favicon.ico" type="image/x-icon" />
      <link rel="stylesheet" type="text/css" href="skin/skin1_forum.php?urlget=IE8__1__51" />
      <script src="include/javascript/main.php?urlget=IE8__51" type="text/javascript"></script>
</head>

看看本论坛网页用什么编码?

下面是MSN中国网的网页
<!DOCTYPE html><html><head><meta charset="UTF-8" /><meta http-equiv="Refresh" content="3600" /><title>MSN中文网:时尚生活 白领门户; (MSN官方下载)</title>



[ 本帖最后由 TonyDeng 于 2011-8-26 21:27 编辑 ]

授人以渔,不授人以鱼。
2011-08-26 21:16
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
以下是引用TonyDeng在2011-8-26 20:46:28的发言:

不考虑UTF8,Unicode全双字节码是Windows操作系统内部的编码,对C程序设计来说,不对外,写网页时才要考虑读写外部文件编码,那与程序自身处理无关(读进来后也一样用2字节码处理),事实上Windows在操作系统层级也要把各种编码转为Unicode双字节码,这种消耗是不可避免的,与其如此,一开始就致力原始编码格式。

处理UTF8,跟处理ANSI没什么本质差异,都要先判断字符性质决定下一个、两个字符的用法。凡是处理过这类问题的程序员,都不会困惑于字符串中间出现0数值(被传统C语法当作字符串结束)。楼主开始的问题,问怎么用二进制处理汉字,就极可能是碰到Unicode编码的0值被截断了字符串,不然不会那么问的。

传统ANSI编码,凡是高位为1的字符,视为双字节汉字,此时必须继续读入下一个byte,与当前的字符连在一起构成整体。如果高位为0,就是普通单字符。同样,UTF8之类,也有它自己的变长法则,按照编码规定做就是了。Windows采用完全双字节编码,省掉了很多麻烦,虽然字符串占用内存多了,但代码占用的资源少了。

12楼的代码,是在Windows控制台中通过键盘按键读入数据的例程,操作系统给我们的就是Unicode编码,不是别的,所以只需那样处理。如果从外部文件读入,需要试算分析它是什么编码,但没有绝对能判断正确的方法,因此网页文件才要一开始声明自己是什么编码。

原来是一个windows coder

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2011-08-26 22:39
莫桑比克
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2011-8-2
收藏
得分:0 
多谢了。不过还有个问题就是。如果用二进制来向整个文件,进行比较行吗。
2011-08-27 20:51
imvicky
Rank: 2
等 级:论坛游民
帖 子:24
专家分:30
注 册:2011-8-25
收藏
得分:0 
莫不是 做登陆器检测外挂字符的东东 ?

=======Never give up !=======
2011-08-28 08:44
快速回复:高人们来解答下。C读入和输出中文的问题。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020453 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved