我有一个奇怪的,恼人的Python 2.6问题.我正在尝试在我的嵌入式Linux ARM板上运行此文件(和另一个). http://svn.tuxisalive.com/software_suite_v3/smart-core/smart-server/trunk/TDSService.py
我收到此错误:
文件"tuxhttpserver.py",第1行语法错误:编码问题:带BOM
我知道错误是关于BOM字节等等.但是,没有BOM字节,它是简单的Ascii.我用Hexeditor检查,linux File命令说它的Ascii.
我在这里吓坏了...代码在我的Sheevaplug(也是一个基于ARM的系统)上运行良好.
我在尝试识别没有BOM的文件的编码时遇到了问题,特别是当文件以非ascii字符开头时.
我找到了关于如何识别文件编码的两个主题,
目前,我创建了一个类来识别文件的不同编码(例如UTF-8,UTF-16,UTF-32,UTF-16无BOM等),如下所示,
public class UnicodeReader extends Reader {
private static final int BOM_SIZE = 4;
private final InputStreamReader reader;
/**
* Construct UnicodeReader
* @param in Input stream.
* @param defaultEncoding Default encoding to be used if BOM is not found,
* or <code>null</code> to use system default encoding.
* @throws IOException If an I/O error occurs.
*/
public UnicodeReader(InputStream in, String defaultEncoding) throws IOException {
byte bom[] = new byte[BOM_SIZE];
String encoding;
int unread;
PushbackInputStream pushbackStream …Run Code Online (Sandbox Code Playgroud) 我需要一个文件,我想确保用utf8编码.
所以,我创建了该文件
c:\> gvim umlaute.txt
Run Code Online (Sandbox Code Playgroud)
在VIM我键入Umlaute:
äöü
Run Code Online (Sandbox Code Playgroud)
我检查编码...
:set enc
Run Code Online (Sandbox Code Playgroud)
(VIM回声encoding=latin1)
然后我检查文件编码...
:set fenc
Run Code Online (Sandbox Code Playgroud)
(VIM回声fileencoding=)
然后我写了文件
:w
Run Code Online (Sandbox Code Playgroud)
并检查硬盘上文件的大小:
!dir umlaute.txt
Run Code Online (Sandbox Code Playgroud)
(大小为5个字节)当然可以预期,文本为3个字节,\ x0a\x0d为2个字节.
好的,我现在将编码设置为
:set enc=utf8
Run Code Online (Sandbox Code Playgroud)
缓冲区很奇怪
<e4><f6><fc>
Run Code Online (Sandbox Code Playgroud)
我想这是我之前输入的ascii字符的十六进制表示.所以我重写了它们
äöü
Run Code Online (Sandbox Code Playgroud)
写作,检查大小:
:w
:$ dir umlaute.txt
Run Code Online (Sandbox Code Playgroud)
这一次,它是8个字节.我想这对于每个字符加上\ x0d\x0a是有意义的2个字节.
好的,所以我想确保下次打开文件时它会用encodiung = utf8打开.
:setb
:w
:$ dir umlaute.txt
Run Code Online (Sandbox Code Playgroud)
11个字节.这当然是BOM(ef bb bf)的8(先前)字节+ 3字节.
所以我
:quit
Run Code Online (Sandbox Code Playgroud)
vim并再次打开文件
并检查,如果设置了编码:
:set enc
Run Code Online (Sandbox Code Playgroud)
但VIM坚持认为encoding=latin1.
那么,为什么呢.我原以为BOM会告诉VIM这是一个UTF8文件.
可能重复:
如何在字符串中替换�
我正在从来自数据库的XML表中读取数据。在原始输出中,我遇到了这个字符“�”,它是UTF-8字符串,表示“?”。搜索“?”时,使用str_replace进行简单的搜索并删除并不能解决问题。或“�”。还有其他方法可以从字符串中删除此字符吗?
更新:
作为参考,该函数正在为我清理字符串。
function db_utf8_convert($str)
{
$convmap = array(0x80, 0x10ffff, 0, 0xffffff);
return preg_replace('/\x{EF}\x{BF}\x{BD}/u', '', mb_encode_numericentity($str, $convmap, "UTF-8"));
}
Run Code Online (Sandbox Code Playgroud) 我有一个 bat 文件,我在其中对一些 CSV 文件进行编码。问题是,一旦编码完成,文件的开头就会有一个字符(我猜是 BOM 字节)。这个字符让我很困扰,因为编码后,我使用这个文件来生成数据库。这是编码行(在bat文件内):
powershell -Command "&{ param($Path); (Get-Content $Path) | Out-File $Path -Encoding UTF8 }" CSVs\\pass.csv
Run Code Online (Sandbox Code Playgroud)
有没有办法对没有 BOM 的文件进行编码(如果这是问题)?
谢谢!
有时,.CSV 文件的开头会出现字节顺序标记 (BOM)。当您使用记事本或 Excel 打开文件时,该符号不可见,但是,当您使用各种方法在 R 中读取文件时,您会在第一列的名称中看到不同的符号。这是一个例子
\n\n开头带有 BOM 的示例 csv 文件。
\n\nID,title,clean_title,clean_title_id\n1,0 - 0,,0\n2,"""0 - 1,000,000""",,0\n27448,"20yr. rope walker\nigger",Rope Walker Igger,1832700817\nRun Code Online (Sandbox Code Playgroud)\n\n通读read.csv基础 R 包
(x1 = read.csv("file1.csv",stringsAsFactors = FALSE))\n# \xc3\xaf..ID raw_title semi_clean semi_clean_id\n# 1 1 0 - 0 0\n# 2 2 "0 - 1,000,000" 0\n# 3 27448 20yr. rope walker\\nigger Rope Walker Igger 1832700817\nRun Code Online (Sandbox Code Playgroud)\n\n通读freaddata.table包中的内容
(x2 = data.table::fread("file1.csv"))\n# \xc3\xaf\xc2\xbb\xc2\xbfID raw_title semi_clean semi_clean_id\n# 1: 1 0 - 0 0\n# 2: 2 …Run Code Online (Sandbox Code Playgroud) 显然,要让 excel 很好地打开 CSV 文件,它的开头应该有字节顺序标记。CSV 的下载是通过写入HttpServletResponse控制器中的输出流来实现的,因为数据是在请求期间生成的。当我尝试写入 BOM 字节时出现异常 - java.io.CharConversionException: Not an ISO 8859-1 character: [](即使我指定的编码是UTF-8)。
控制器的方法有问题
@RequestMapping("/monthly/list")
public List<MonthlyDetailsItem> queryDetailsItems(
MonthlyDetailsItemQuery query,
@RequestParam(value = "format", required = false) String format,
@RequestParam(value = "attachment", required = false, defaultValue="false") Boolean attachment,
HttpServletResponse response) throws Exception
{
// load item list
List<MonthlyDetailsItem> list = detailsSvc.queryMonthlyDetailsForList(query);
// adjust format
format = format != null ? format.toLowerCase() : "json";
if (!Arrays.asList("json", "csv").contains(format)) format = "json";
// modify common response …Run Code Online (Sandbox Code Playgroud) VS Code 不断使用 BOM 以 UTF-8 格式保存我的文件。我的files.encoding设置未utf8在我的用户设置或工作区设置中设置(默认为)。files.autoGuessEncoding设置也未设置(默认为false)。在我对文件进行任何编辑后,在 Notepad++ 中将其更改为不带 BOM 后,它会自动将其与 BOM 一起保存。我能做些什么来解决这个问题?
byte-order-mark utf-8 character-encoding visual-studio-code vscode-settings
有没有一种干净的方法可以附加SEP=,到由 创建的 CSV 文件的开头Export-CSV?
注意:这是一个 XY 问题;有关我的根本问题的信息,请参阅下面为什么需要这个。我要求提供 SEP 部分,因为这似乎是最好的解决方案,因为我需要继续使用 UTF8 CSV,并且不希望用户必须更改其工作方式以避免出现问题。
\n\n简单的选择是这样的;然而感觉很混乱(即我们释放文件上的锁然后必须返回并更新它)。
\n\nfunction Repair-Csv {\n [CmdletBinding()]\n Param (\n [Parameter(Mandatory = $true, ValueFromPipeline = $true)]\n [string]$Path\n )\n Begin {\n $sep = "SEP=,`r`n" \n }\n Process {\n $sep + (Get-Content -Path $Path -Raw) | Set-Content -Path $Path\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我尝试创建一个代理函数(下面的代码),但发现包装的Export-CSV命令不会将其输出附加到我的调整文件中,而是读取我已经编写的内容并尝试用作SEP=列标题;所以我最终没有数据(除非我导出的对象的属性之一恰好被称为SEP=.
# $MetaData = New-Object System.Management.Automation.CommandMetaData (Get-Command \'Export-CSV\')\n# [System.Management.Automation.ProxyCommand]::Create($MetaData)\nfunction Export-CsvAdvanced {\n [CmdletBinding(DefaultParameterSetName=\'Delimiter\', SupportsShouldProcess=$true, …Run Code Online (Sandbox Code Playgroud) 我正在使用League / CSV软件包在Laravel 5.7中导出模型:
public function export(Request $request)
{
$people = Person::all();
$location = 'export.csv';
$csv = Writer::createFromPath($location, 'w');
$csv->setOutputBOM(Writer::BOM_UTF8);
$csv->setDelimiter(';');
foreach ($people as $person) {
$csv->insertOne($this->serializePerson($person));
}
return response($location);
}
protected function serializePerson($person)
{
return [
$person->name,
$person->age,
];
}
Run Code Online (Sandbox Code Playgroud)
这样就export.csv可以确定文件了,但是所有变音符的显示方式都不正确(例如??)。我本以为设置BOM可以解决此问题。有没有人有办法解决吗?
编辑:问题不是出口,是Mac Excel错误地显示了变音符号。请参阅下面的答案。