问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

Java 如何设置打开文件内容的字符集

发布网友 发布时间:2022-04-22 01:03

我来回答

7个回答

热心网友 时间:2022-04-20 04:55

3.5.3. meta设置
指定网页使用的编码,该设置对静态网页尤其有作用。因为静态网页无法采用jsp的设置,而且也无法执行response.setCharacterEncoding()。例如:<META http-equiv="Content-Type" content="text/html; charset=GBK" />
如果同时采用了jsp输出和meta设置两种编码指定方式,则jsp指定的优先。因为jsp指定的直接体现在response中。
需要注意的是,apache有一个设置可以给无编码指定的网页指定编码,该指定等同于jsp的编码指定方式,所以会覆盖静态网页中的meta指定。所以有人建议关闭该设置。
3.5.4. form设置
当浏览器提交表单的时候,可以指定相应的编码。例如:<form accept-charset= "gb2312">。一般不必不使用该设置,浏览器会直接使用网页的编码。
4. 系统软件
下面讨论几个相关的系统软件。
4.1. mysql数据库
很明显,要支持多语言,应该将数据库的编码设置成utf或者unicode,而utf更适合与存储。但是,如果中文数据中包含的英文字母很少,其实unicode更为适合。
数据库的编码可以通过mysql的配置文件设置,例如default-character-set=utf8。还可以在数据库链接URL中设置,例如: useUnicode=true&characterEncoding=UTF-8。注意这两者应该保持一致,在新的sql版本里,在数据库链接URL里可以不进行设置,但也不能是错误的设置。
4.2. apache
appache和编码有关的配置在httpd.conf中,例如AddDefaultCharset UTF-8。如前所述,该功能会将所有静态页面的编码设置为UTF-8,最好关闭该功能。
另外,apache还有单独的模块来处理网页响应头,其中也可能对编码进行设置。
4.3. linux默认编码
这里所说的linux默认编码,是指运行时的环境变量。两个重要的环境变量是LC_ALL和LANG,默认编码会影响到java URLEncode的行为,下面有描述。
建议都设置为"zh_CN.UTF-8"。
4.4. 其它
为了支持中文文件名,linux在加载磁盘时应该指定字符集,例如:mount /dev/hda5 /mnt/hda5/ -t ntfs -o iocharset=gb2312。
另外,如前所述,使用GET方法提交的信息不支持request.setCharacterEncoding(),但可以通过tomcat的配置文件指定字符集,在tomcat的server.xml文件中,形如:<Connector ... URIEncoding="GBK"/>。这种方法将统一设置所有请求,而不能针对具体页面进行设置,也不一定和browser使用的编码相同,所以有时候并不是所期望的。
5. URL地址
URL地址中含有中文字符是很麻烦的,前面描述过使用GET方法提交表单的情况,使用GET方法时,参数就是包含在URL中。
5.1. URL编码
对于URL中的一些特殊字符,浏览器会自动进行编码。这些字符除了"/?&"等外,还包括unicode字符,比如汉子。这时的编码比较特殊。
IE有一个选项"总是使用UTF-8发送URL",当该选项有效时,IE将会对特殊字符进行UTF-8编码,同时进行URL编码。如果改选项无效,则使用默认编码"GBK",并且不进行URL编码。但是,对于URL后面的参数,则总是不进行编码,相当于UTF-8选项无效。比如"中文.html?a=中文",当UTF-8选项有效时,将发送链接"%e4%b8%ad%e6%96%87.html?a=\x4e\x2d\x65\x87";而UTF-8选项无效时,将发送链接"\x4e\x2d\x65\x87.html?a=\x4e\x2d\x65\x87"。注意后者前面的"中文"两个字只有4个字节,而前者却有18个字节,这主要时URL编码的原因。
当web server(tomcat)接收到该链接时,将会进行URL解码,即去掉"%",同时按照ISO8859-1编码(上面已经描述,可以使用URLEncoding来设置成其它编码)识别。上述例子的结果分别是"\ue4\ub8\uad\ue6\u96\u87.html?a=\u4e\u2d\u65\u87"和"\u4e\u2d\u65\u87.html?a=\u4e\u2d\u65\u87",注意前者前面的"中文"两个字恢复成了6个字符。这里用"\u",表示是unicode。
所以,由于客户端设置的不同,相同的链接,在服务器上得到了不同结果。这个问题不少人都遇到,却没有很好的解决办法。所以有的网站会建议用户尝试关闭UTF-8选项。不过,下面会描述一个更好的处理办法。
5.2. rewrite
熟悉的人都知道,apache有一个功能强大的rewrite模块,这里不描述其功能。需要说明的是该模块会自动将URL解码(去除%),即完成上述web server(tomcat)的部分功能。有相关文档介绍说可以使用[NE]参数来关闭该功能,但我试验并未成功,可能是因为版本(我使用的是apache 2.0.54)问题。另外,当参数中含有"?& "等符号的时候,该功能将导致系统得不到正常结果。
rewrite本身似乎完全是采用字节处理的方式,而不考虑字符串的编码,所以不会带来编码问题。
5.3. URLEncode.encode()
这是Java本身提供对的URL编码函数,完成的工作和上述UTF-8选项有效时浏览器所做的工作相似。值得说明的是,java已经不赞成不指定编码来使用该方法(deprecated)。应该在使用的时候增加编码指定。
当不指定编码的时候,该方法使用系统默认编码,这会导致软件运行结果得不确定。比如对于"中文",当系统默认编码为"gb2312"时,结果是"%4e%2d%65%87",而默认编码为"UTF-8",结果却是"%e4%b8%ad%e6%96%87",后续程序将难以处理。另外,这儿说的系统默认编码是由运行tomcat时的环境变量LC_ALL和LANG等决定的,曾经出现过tomcat重启后就出现乱码的问题,最后才郁闷的发现是因为修改修改了这两个环境变量。
建议统一指定为"UTF-8"编码,可能需要修改相应的程序。
5.4. 一个解决方案
上面说起过,因为浏览器设置的不同,对于同一个链接,web server收到的是不同内容,而软件系统有无法知道这中间的区别,所以这一协议目前还存在缺陷。
针对具体问题,不应该侥幸认为所有客户的IE设置都是UTF-8有效的,也不应该粗暴的建议用户修改IE设置,要知道,用户不可能去记住每一个web server的设置。所以,接下来的解决办法就只能是让自己的程序多一点智能:根据内容来分析编码是否UTF-8。
比较幸运的是UTF-8编码相当有规律,所以可以通过分析传输过来的链接内容,来判断是否是正确的UTF-8字符,如果是,则以UTF-8处理之,如果不是,则使用客户默认编码(比如"GBK"),下面是一个判断是否UTF-8的例子,如果你了解相应规律,就容易理解。
public static boolean isValidUtf8(byte[] b,int aMaxCount){
int lLen=b.length,lCharCount=0;
for(int i=0;i<lLen && lCharCount<aMaxCount;++lCharCount){
byte lByte=b[i++];//to fast operation, ++ now, ready for the following for(;;)
if(lByte>=0) continue;//>=0 is normal ascii
if(lByte<(byte)0xc0 || lByte>(byte)0xfd) return false;
int lCount=lByte>(byte)0xfc?5:lByte>(byte)0xf8?4
:lByte>(byte)0xf0?3:lByte>(byte)0xe0?2:1;
if(i+lCount>lLen) return false;
for(int j=0;j<lCount;++j,++i) if(b[i]>=(byte)0xc0) return false;
}
return true;
}
相应地,一个使用上述方法的例子如下:
public static String getUrlParam(String aStr,String aDefaultCharset)
throws UnsupportedEncodingException{
if(aStr==null) return null;
byte[] lBytes=aStr.getBytes("ISO-8859-1");
return new String(lBytes,StringUtil.isValidUtf8(lBytes)?"utf8":aDefaultCharset);
}
不过,该方法也存在缺陷,如下两方面:
l 没有包括对用户默认编码的识别,这可以根据请求信息的语言来判断,但不一定正确,因为我们有时候也会输入一些韩文,或者其他文字。
l 可能会错误判断UTF-8字符,一个例子是"学习"两个字,其GBK编码是" \xd1\xa7\xcf\xb0",如果使用上述isValidUtf8方法判断,将返回true。可以考虑使用更严格的判断方法,不过估计效果不大。
有一个例子可以证明google也遇到了上述问题,而且也采用了和上述相似的处理方法,比如,如果在地址栏中输入"http://www.google.com/search?hl=zh-CN&newwindow=1&q=学习",google将无法正确识别,而其他汉字一般能够正常识别。
最后,应该补充说明一下,如果不使用rewrite规则,或者通过表单提交数据,其实并不一定会遇到上述问题,因为这时可以在提交数据时指定希望的编码。另外,中文文件名确实会带来问题,应该谨慎使用。
6. 其它
下面描述一些和编码有关的其他问题。
6.1. SecureCRT
除了浏览器和控制台与编码有关外,一些客户端也很有关系。比如在使用SecureCRT连接linux时,应该让SecureCRT的显示编码(不同的session,可以有不同的编码设置)和linux的编码环境变量保持一致。否则看到的一些帮助信息,就可能是乱码。
另外,mysql有自己的编码设置,也应该保持和SecureCRT的显示编码一致。否则通过SecureCRT执行sql语句的时候,可能无法处理中文字符,查询结果也会出现乱码。
对于Utf-8文件,很多编辑器(比如记事本)会在文件开头增加三个不可见的标志字节,如果作为mysql的输入文件,则必须要去掉这三个字符。(用linux的vi保存可以去掉这三个字符)。一个有趣的现象是,在中文windows下,创建一个新txt文件,用记事本打开,输入"连通"两个字,保存,再打开,你会发现两个字没了,只留下一个小黑点。
6.2. 过滤器
如果需要统一设置编码,则通过filter进行设置是个不错的选择。在filter class中,可以统一为需要的请求或者回应设置编码。参加上述setCharacterEncoding()。这个类apache已经给出了可以直接使用的例子SetCharacterEncodingFilter。
6.3. POST和GET
很明显,以POST提交信息时,URL有更好的可读性,而且可以方便的使用setCharacterEncoding()来处理字符集问题。但GET方法形成的URL能够更容易表达网页的实际内容,也能够用于收藏。
从统一的角度考虑问题,建议采用GET方法,这要求在程序中获得参数是进行特殊处理,而无法使用setCharacterEncoding()的便利,如果不考虑rewrite,就不存在IE的UTF-8问题,可以考虑通过设置URIEncoding来方便获取URL中的参数。
6.4. 简繁体编码转换
GBK同时包含简体和繁体编码,也就是说同一个字,由于编码不同,在GBK编码下属于两个字。有时候,为了正确取得完整的结果,应该将繁体和简体进行统一。可以考虑将UTF、GBK中的所有繁体字,转换为相应的简体字,BIG5编码的数据,也应该转化成相应的简体字。当然,仍旧以UTF编码存储。
例如,对于"语言 ?言",用UTF表示为"\xE8\xAF\xAD\xE8\xA8\x80 \xE8\xAA\x9E\xE8\xA8\x80",进行简繁体编码转换后应该是两个相同的 "\xE8\xAF\xAD\xE8\xA8\x80>"。

热心网友 时间:2022-04-20 06:13

方法一:在Eclipse里设置

1、windows->Preferences...打开"首选项"对话框,左侧导航树,导航到general->Workspace,右侧Text file encoding,选择Other,改变为 utf-8(必须小写),以后新建立工程其属性对话框中的Text file encoding即为UTF-8。
  2、windows->Preferences...打开"首选项"对话框,左侧导航树,导航到general->Content Types,右侧Content Types树,点开Text,选择 Java Source File,在下面的Default encoding输入框中输入UTF-8,点Update,则设置Java文件编码为UTF-8。然后设置jsp、js、css等类型的Default encoding,设置方式同Java Source File。
  3.windows->Preferences...打开"首选项"对话框,左侧导航树,导航到MyEclipse->Files and Editors->JSP,把Encoding改为UTF-8
方法二:在代码中设置
要是把控制台的内容输出到文件中(输出流)
OutputStream out = new FileOutputStream("d:\\demo.txt");
out.write("我们".getBytes());
在getBytes()里头写你要用的字符集,例如:out.write("我们".getBytes("UTF-8"));
要是想把文件的内容输入到控制台中(输入流)
InputStreamReader in = new InputStreamReader(new FileInputStream(“demo.txt”),”UTF-8”);

热心网友 时间:2022-04-20 07:48

打开的时候不需要设,在读写文件的时候设置字符集就可以了

热心网友 时间:2022-04-20 11:47

把文件读取出来的时候设置就可以了

热心网友 时间:2022-04-20 14:12

我记得是把内容读出来以后,把内容转成相应的编码

热心网友 时间:2022-04-20 16:53

InputStream in=new FileInputStream("D:/myfile.txt");
InputStreamReader isr=new InputStreamReader(in,"GBK");

热心网友 时间:2022-04-20 19:51

。。。。。小手一抖,酱油到手,手提酱油,低头猛走。。。。
Java 如何设置打开文件内容的字符集

2、windows-&gt;Preferences...打开"首选项"对话框,左侧导航树,导航到general-&gt;Content Types,右侧Content Types树,点开Text,选择 Java Source File,在下面的Default encoding输入框中输入UTF-8,点Update,则设置Java文件编码为UTF-8。然后设置jsp、js、css等类型的Default encoding,设置方式同Java Source File。 3.wind...

如何解决java编译时编码问题造

首先,打开Eclipse的首选项窗口,通过点击顶部菜单的"Window",然后选择"Preferences"选项。在打开的窗口中,定位到"General"下的"WorkSpace"选项。在这里,你可以看到当前的工作空间默认编码,将其更改为"GBK",这将确保代码的中文字符被正确处理。如果需要支持其他编码格式,可以选择"Other"选项,从下拉菜单中...

如何修改java的默认字符集

方法一:画面端什么都不用做,其实就是使用默认设置,(UTF-8)服务器端接受时 String truckno = new String(request.getParameter("truckno").getBytes("ISO-8859-1"),"GBK");方法二:在画面端就直接加编码 //车号 document.outputTallyVerifyForm.truckno.value = encodeURI(document.outputTallyVerify...

java读取文件内容使用的是UTF-8,直接插入oracle数据库后,中文会显示乱...

一种办法是修改数据库的编码格式(比较不建议,因为会影响到其他地方的编码问题).另外一种办法就是修改读取文件的解码格式。。。但是要注意的是,文件的编码要和解码的字符集相同。不然读取的时候可能会出现乱码。

怎么改变java虚拟机默认字符集

设置属性有以下三种:1.你就是没有保存回去,就差一步了 Properties pps=System. getProperties();pps.put("file.encoding","x-MacThai");//设置完成后要将属性保存 System.setProperties(pps);2.System.setProperty("file.encoding","x-MacThai");3.运行时设置 java -D file.encoding=x-Mac...

java 怎么判断文本内容的编码

1:简单判断是UTF-8或不是UTF-8,因为一般除了UTF-8之外就是GBK,所以就设置默认为GBK。按照给定的字符集存储文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理就是只要读出文件前三个字节,判定这些字节的值,就可以得知其编码的格式。其实,如果项目运行的平台就是中文...

怎样用Java读取TXT文本乱码解决方案

就这种情况下获取到的str是乱码,我想出现乱码肯定是字符集编码的问题,然后自己新建了一个文本文档测试没有问题(开始用的文本时别的程序导出的),所以我估计是开始那个txt文件编码的问题,查看发现是Unicode编码(如何查看txt的编码呢,教你一个笨笨的办法:打开文件——另存为,然后看到最下面的编码,...

java有没有那个方法 获取文件保存的编码方式啊?

正常的方法是当你读取一个文件时,应该有人已经告诉了你这个文件是字符集是什么。这个过程应该是人工决定的,比如人们把它写在一个配置文件中,或者约定了整个软件只使用 UTF8 或 GBK 一种编码方式。作为一个通用型的软件推荐使用 UTF8 而不是 GBK,因为当你保存一个人名时你也知道这片神奇的土地上...

eclipse字符集改为utf-8教程

1打开eclipse,选择windows,然后选择Preferences 2在下图左侧展开generalWorkspace,然后在右侧的Text file encoding处选择Other,在下拉框中选择UTF8就可以了;修改eclipse默认工作空间编码方式,GeneralWorkspaceText file encoding 修改工程编码方式,右击工程PropertiesResourceText file encoding 修改文件编码方式,...

java怎么设置utf8

服务器端 修改数据库配置文件/etc/my.cnf character-set-server=utf8mb4 collation_server=utf8mb4_unicode_ci 重启MySQL(按照官方文档,这两个选项都是可以动态设置的,但是实际的经验是Server必须重启一下)已有的表修改编码为utf8mb4 ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;...

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
魔兽世界大灾变国服好像要来了,,问一问部落和联盟哪个占优势!!!_百... 魔兽一共几个种族 国服魔兽世界开了CTM后能直接转狼人吗? 有了狼人以后,国服的部落联盟比例会有改善吗? 为什么联盟新增的是狼人,部落不是吸血鬼,而是地精? 草莓如何追肥 天津河西区附近玩三国杀的地方 "由于"和"因此"能否连用? 我想找一份保姆的工作,主要想培训一下有没有好一点的家政公司 ...书上说“如果两列波的振幅相同,则振动减弱点将会总是处于静止的,并... 魔兽争霸3冰封王座DOTA的故事 半导体装片银浆烘烤温度改变有什么影响? dota2怎么暂停?dota2如何暂停 绝地求生UE4-TSLGAME GAME已崩溃并将关闭 查银信商通卡余额 导电银浆干了是什么颜色?我在80度条件下烘干,银... 星巴克星礼卡怎样查询余额? 女生dota2取什么名字 在南阳市有哪些家棉纺、织布厂有浆纱工艺,我们是... dota2商店为什么显示不出来 资和信商通卡过期还能查余额吗 我想查一下我的商通卡怎样查余额 dota2亚洲邀请赛女解说是谁 UE4启动器是否有办法添加本地版本 ue4不用Epic安装后打不开 朋友送我一张《资和信的商通卡》我不知道怎么用。... ue4 自定义包格式 北京商通卡怎样查余额 资和信商通卡用完后怎么查到消费账单 ue 文件configfile 处理失败 资和信商通卡的问题 用什么设备可以把玉米浆烘干 银信商通卡能查余额吗? DOTA地穴编织者明明是蜘蛛为什么都要叫蚂蚁? ue4引擎能下载到u盘里再用电脑使用吗 资和信商通卡 真伪 魔兽、dota月女用法 UE4开发的VR游戏,有没有画面效果能达到unity开发... 很喜欢撒神的DOTA第一视角,想要满楼水平(撒萌萌... 为什么ue4是中文而u3d是英文 商通卡的常见问题 资和信商通卡外包装上有金额吗 dota孙悟空出了没?那个版本 滴滴出行里面的出行卡一定要绑定滴滴出行卡或者资... 虚幻4可以在linux系统下启动吗 广东中海粤会计师事务所有限公司怎么样? 人民币100元AA00000000的是真的吗? 中商购物卡网上能用吗 高圆圆代言的手表是什么? vr家装会是ue4的天下,没unity5什么事
  • 焦点

最新推荐

猜你喜欢

热门推荐