Perl如何创建一个UTF-8的文件

sinbao 2007-08-30 01:13:52
我们知道

open MyFile, ">a.txt";
print MyFile "SomeText";
close MyFile;

创建了一个文件a.txt,然后写入了一些东西.
但是a.txt的文件编码是ANSI的,
如何才能让它是UTF-8的呢?
高手赐教啊!!!
...全文
917 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
UltraBejing 2008-04-30
  • 打赏
  • 举报
回复
接分是王道!
wx红杉树 2007-09-14
  • 打赏
  • 举报
回复
use Encode;
use File::BOM qw( :all );
open MyFile, '>:encoding(UTF-8 ):via(File::BOM)', "a.txt";
my $string ="aaaaaa";
$string=decode("gbk",$string);
print MyFile "$string";
close MyFile;
这个些许可以吧
iambic 2007-09-05
  • 打赏
  • 举报
回复
叫 BOM 。
iambic 2007-09-05
  • 打赏
  • 举报
回复
那几个开头的字符是一个很讨厌的东西(有一个专门的名词,忘记叫什么了),在一些windows文本环境下存在,其本身并不是utf-8文本的一部分——实际上它破坏了文本协议。
一个空的utf-8文本就应该是一个空文本。如果visual studio的文件对这几个字符有强制要求,那只能算是一项额外需求。
wuyu637 2007-09-05
  • 打赏
  • 举报
回复

怎么觉得这种写法很裸,不过还是赞一下lz.
sinbao 2007-09-05
  • 打赏
  • 举报
回复
答案:
open( OUT, ">:utf8", "a.txt" ) or die "a.out: $!";
print OUT "\x{feff}";
print OUT "aaaa\n";
close OUT;
sinbao 2007-08-31
  • 打赏
  • 举报
回复
简单点说,我的实际问题是,
使用perl写一个visual studio 2005 (vs)的solution(.sln)文件,但是vs不认识,然后我用记事本打开,选择"UTF-8"另存之后vs就认识了.
sinbao 2007-08-31
  • 打赏
  • 举报
回复
iambic:
1. 怎么判定文件的编码:
用记事本打开这个文件,点"另存为",最下面有个"编码(Encoding)"可以选择,里面有"ANSI,Unicode,UTF-8"等选项.
最开始默认的那个选项就是你当前的文件类型
2. 我的字符集应该是所有的都支持(unicode?)

hzcpig:
我好像不是要做编码的转换.

all:
不知道大家对c#了不了解,c#创建UTF-8文件很简单
StreamWriter sw = new StreamWriter("a.txt", false, Encoding.UTF8);
sw.WriteLine("some text");
sw.Close();

但是我就是找不到perl里面对应的...
sinbao 2007-08-31
  • 打赏
  • 举报
回复
iambic:
1. 我的代码不长啊,就把"some text"替换成我的sln文件里面的内容就是我的代码了,只是不正确,永远是ANSI而已~~
但是上面的c#是可以的.
2. 对比一下同样内容的ANSI和UTF-8文件的十六进制内容,就是UTF-8前面多了"ef bb bf",说白了,判断一个文件是不是UTF-8文件就是看它前面是不是以这几个十六进制开头. (Unicode文件是以"ff fe"开头).

晕啊,这个问题难道还说不清楚吗?用c,c++,c#是非常容易的啊...
这么说吧,我就是要创建一个空的txt的UTF-8编码的文件.

sinbao 2007-08-31
  • 打赏
  • 举报
回复
wuyu637:
你的代码虽然会有'Wide character in print ...'的异常,但确实可以使文件为UTF8编码,
不过如果把"你好"换成"Hello"就又回来ANSI了...
iambic 2007-08-31
  • 打赏
  • 举报
回复
楼主代码多长,贴上来看看吧。转码utf8有多种方法,但是需要一个正确的认识。即你需要知道什么叫做编码解码,以及转换前后的编码各是什么。光凭一个记事本另存是不准确的。

最好有两个文件前后的十六进制码对比,或者原来的Perl代码。
wuyu637 2007-08-31
  • 打赏
  • 举报
回复
#!/usr/bin/perl
use encoding 'gb2312' , STDIN => 'gb2312', STDOUT => 'utf8';
$filename = "test.txt";
open (OUTFILE,">$filename");

print OUTFILE ("你好");

close(OUTFILE);
hzcpig 2007-08-30
  • 打赏
  • 举报
回复
perldoc Encode
上面的帮助详细告诉你怎么转换编码

比如$util=encode("ansi",decode_utf8($util));
iambic 2007-08-30
  • 打赏
  • 举报
回复
你怎么确定没有成功的?还有你的文件内容到底是什么字符集?
sinbao 2007-08-30
  • 打赏
  • 举报
回复


用记事本打开这个文件,点"另存为",最下面有个"编码(Encoding)"可以选择,里面有"ANSI,Unicode,UTF-8"等选项.
最开始默认的那个选项就是你当前的文件类型,比如"ANSI".
而我用上面的代码做出来的文件都是"ANSI",我要的是"UTF-8".
我试过下面的代码
open MyFile, ">:encoding(utf-8)", "a.txt";
print MyFile "SomeText";
close MyFile
;
但是也不起作用.
iambic 2007-08-30
  • 打赏
  • 举报
回复
ANSI编码是什么意思?如果所有字符都在[0, 128)区间,那就不必转为utf-8。自然兼容。

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧