我正在寻找正确的语法来从 UTF-16 文本文件中删除 BOM,我已经成功地为 UTF-8 做到了这一点。请参阅下面的我尝试过的语法:
$readline =~ s/^\N{ZERO WIDTH NO-BREAK SPACE}//;
$readline =~ s/^\N{BYTE ORDER MARK}//;
$readline =~ s/^\N{BOM}//;
$readline =~ s/^\x{FEFF}//;
$readline =~ s/^\0x{FEFF}//;
$readline =~ s/^\x{FE}\x{FF}//;
$readline =~ s/^\xFE\xFF//;
$readline =~ s/^\0xFE\0xFF//;
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,这些是重复的,但我正在尝试任何我能找到的东西。为了打开文件,我使用了编码功能。任何帮助将不胜感激。
我有一个文件监视器,它正在从使用utf-16LE编码的不断增长的文件中获取内容.写入它的第一位数据有BOM可用 - 我用它来识别UTF-8的编码(我的文件的MOST编码在其中).我抓住了BOM并重新编码为UTF-8,所以我的解析器并没有吓坏.问题是,由于它是一个不断增长的文件,并不是每一位数据都有BOM.
这是我的问题 - 没有将BOM字节添加到我拥有的每组数据(因为我没有对源的控制)我可以只查找UTF-16\000中固有的空字节,然后使用那作为我的标识符而不是BOM?这会让我头疼吗?
我的架构涉及一个ruby Web应用程序,当我用java编写的解析器拾取它时,将收到的数据记录到一个临时文件中.
现在写我的识别/重新编码代码如下所示:
// guess encoding if utf-16 then
// convert to UTF-8 first
try {
FileInputStream fis = new FileInputStream(args[args.length-1]);
byte[] contents = new byte[fis.available()];
fis.read(contents, 0, contents.length);
if ( (contents[0] == (byte)0xFF) && (contents[1] == (byte)0xFE) ) {
String asString = new String(contents, "UTF-16");
byte[] newBytes = asString.getBytes("UTF8");
FileOutputStream fos = new FileOutputStream(args[args.length-1]);
fos.write(newBytes);
fos.close();
}
fis.close();
} catch(Exception e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
我想支持诸如欧元,em-dashes和其他角色之类的东西.我修改了上面的代码看起来像这样,它似乎传递了我对这些字符的所有测试:
// guess encoding if utf-16 …Run Code Online (Sandbox Code Playgroud) 我管理两个不同的博客.它们都是wordpress 2.8.6(因此它们具有完全相同的源代码,插件除外)但它们位于两个不同的托管平台(hostmonster.com和aruba.it).为了解释我的问题,我已经使用SmartSniff转发了与每个站点的会话.
这是来自hostmonster的转储:
GET /blog/paolo/ HTTP/1.1
Host: www.e-venturi.com
Accept-Encoding: identity
Accept-Language: en-us
Accept: text/html, text/plain, text/xml, image/gif, image/x-xbitmap, image/x-icon,image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0;)
HTTP/1.1 200 OK
Date: Sat, 28 Nov 2009 23:47:38 GMT
Server: Apache/2.2.14 (Unix) mod_ssl/2.2.14 OpenSSL/0.9.8l DAV/2 mod_auth_passthrough/2.1 FrontPage/5.0.2.2635
X-Powered-By: PHP/5.2.11
X-Pingback: http://www.e-venturi.com/blog/paolo/xmlrpc.php
Vary: Accept-Encoding
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
a6
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Run Code Online (Sandbox Code Playgroud)
现在来自阿鲁巴:
GET /blog/ HTTP/1.1
Host: www.cubanite.net
Accept-Encoding: identity
Accept-Language: en-us …Run Code Online (Sandbox Code Playgroud) 我一直在使用PHP自定义CMS,直到最近才遇到任何问题.测试时,我注意到字符串已经开始出现在索引页面的顶部.在整个代码中使用一些die语句进行测试,似乎输出是在一个文件包含之间.
档案A.
<?php
if (!defined('IN_CMS'))
{
exit;
}
require(INCLUDE_PATH . '/pages/homepage/main.php');
?>
Run Code Online (Sandbox Code Playgroud)
文件B(包含文件)
<?php
if (!defined('IN_CMS'))
{
exit;
}
$db->sql_query("SELECT * FROM `" . DB_PREFIX . "categories` active = 1");
$cats = $db->sql_results();
$categories = array();
foreach($cats as $cat)
{
$cat_info = array(
'name' => $cat['name'],
'description' => $cat['description'],
'image' => $setting['site_url'] . '/thumbnails/' . $cat['image'],
);
$categories[] = $cat_info;
}
include theme('index');
?>
Run Code Online (Sandbox Code Playgroud)
我无法理解输出的来源,但它似乎介于两个文件之间.我已经ob_start()在文件A中的包含行之前添加,并且ob_end_clean()在包含文件的最开头添加并且输出没有显示,但是在两个文件中的任何地方都没有杂散输出.
我有一个网站:http://www.sucramma.dk 当我在FF,Chrome或Safari时,网站显示应该,但在IE中网站是左对齐的,并且正在运行是怪癖模式.为什么?doctype已设置好!
我知道BOM用于UTF-8文件,但是每个字符都是2字节的文本文件呢,我也应该添加字节顺序标记吗?
这是代码:
byte bytes[] = {0x2e, 0x20, 0x65, 0x00, 0x74, 0x00, 0x61, 0x00, 0x64, 0x00, 0x70, 0x00, 0x75, 0x00, 0x67, 0x00};
std::wstring s;
s.resize( 8 );
memcpy( &s[0], bytes, 16 );
_tprintf( _T("key: %s\n"), s.c_str());
MessageBox ( 0, s.c_str(), _T(""), 0 );
Run Code Online (Sandbox Code Playgroud)
消息框中的结果gupdate位于控制台中?etadpug.
我认为这是编码.0x2e20或0x202e是什么意思吗?
我有一个包含XML文件的文件夹,我需要将它们合并到一个文件中.当我尝试这个:
var allFiles = Directory.GetFiles(path, "*.xml");
String result = Path.Combine( path, "merged.xml" );
using( var stream = new FileStream( result, FileMode.Create, FileAccess.Write ) ) {
foreach( var file in allFiles ) {
var fileContents = File.ReadAllBytes( file );
stream.Write( fileContents , 0, fileContents.Length );
}
stream.Close();
}
Run Code Online (Sandbox Code Playgroud)
我看到0xEF 0xBB 0xBF(字节顺序标记)序列出现在任何两个文件的内容之间的结果文件中,但不出现在文件的开头而不是文件的末尾.
如果我StreamWriter改用:
var allFiles = Directory.GetFiles(path, "*.xml");
String result = Path.Combine( path, "merged.xml" );
using( var stream = new FileStream( result, FileMode.Create, FileAccess.Write ) ) {
using( …Run Code Online (Sandbox Code Playgroud) 我有一堆文本文件,其中包含字节顺序标记 (BOM),并且它们还具有 CRLF (\r\n) 结尾来标记行尾。例如,这是八进制转储片段:
$ od -bc P21_T_3-28-2022.txt
0000000 357 273 277 163 164 141 147 145 040 061 015 012 120 154 141 171
357 273 277 s t a g e 1 \r \n P l a y
0000020 151 156 147 040 164 150 145 163 145 040 164 167 157 040 147 141
i n g t h e s e t w o g a
0000040 155 145 163 054 040 162 145 155 …Run Code Online (Sandbox Code Playgroud)