在工作中似乎没有一周没有一些编码相关的conniption,灾难或灾难.这个问题通常来自程序员,他们认为他们可以在不指定编码的情况下可靠地处理"文本"文件.但你不能.
因此,已经决定从此以后禁止文件的名称以*.txt或结尾*.text.我们的想法是,这些扩展误导了偶然程序员对编码的沉闷,这会导致处理不当.没有任何扩展几乎会更好,因为至少你知道你不知道你有什么.
但是,我们并不是那么远.相反,您将需要使用以编码结尾的文件名.因此,对于文本文件,例如,这些会是这样README.ascii,README.latin1,README.utf8,等.
对于需要特定扩展的文件,如果可以在文件本身内部指定编码,例如在Perl或Python中,那么您应该这样做.对于像Java源这样的文件,文件内部不存在这样的工具,你将把编码放在扩展名之前,例如SomeClass-utf8.java.
对于输出,UTF-8是非常优选的.
但是对于输入,我们需要弄清楚如何处理我们的代码库中的数千个文件*.txt.我们想重命名所有这些以符合我们的新标准.但我们不可能全都注意它们.所以我们需要一个真正有效的库或程序.
它们有各种ASCII,ISO-8859-1,UTF-8,Microsoft CP1252或Apple MacRoman.虽然我们知道我们可以判断某些东西是否为ASCII,并且我们知道某些东西是否可能是UTF-8,但我们对8位编码感到困惑.因为我们在混合的Unix环境(Solaris,Linux,Darwin)中运行,大多数桌面都是Mac,所以我们有很多烦人的MacRoman文件.这些尤其是一个问题.
一段时间以来,我一直在寻找一种方法来以编程方式确定哪一个
文件在,我还没有找到一个程序或库,可以可靠地区分这三种不同的8位编码.我们可能单独拥有超过一千个MacRoman文件,因此我们使用的任何字符集检测器都必须能够嗅出它们.我看过的任何东西都无法解决问题.我对ICU字符集检测器库寄予厚望,但它无法处理MacRoman.我也看过模块在Perl和Python中做同样的事情,但一次又一次它总是相同的故事:不支持检测MacRoman.
我正在寻找的是一个现有的库或程序,它可靠地确定文件所在的五种编码中的哪一种 - 并且最好不止于此.特别是它必须区分我引用的三个3位编码,尤其是MacRoman.这些文件的英文文本超过99%; 其他语言中有一些,但并不多.
如果它是库代码,我们的语言首选项是它在Perl,C,Java或Python中,并按此顺序.如果它只是一个程序,那么我们并不关心它是什么语言,只要它是完整的源代码,在Unix上运行,并且完全不受阻碍.
有没有其他人有这个随机编码的遗留文本文件的问题?如果是这样,你是如何尝试解决它的,你有多成功?这是我的问题中最重要的方面,但我也对你是否认为鼓励程序员用这些文件所在的实际编码来命名(或重命名)他们的文件感兴趣,这将有助于我们避免将来出现这个问题.曾经尝试过任何人强制执行该体制的基础上,如果是的话,是说成功与否,为什么?
是的,我完全明白为什么鉴于问题的性质,人们无法保证给出明确的答案.对于小文件尤其如此,您没有足够的数据可供使用.幸运的是,我们的文件很少.除随机README文件外,大多数的大小范围为50k到250k,而且许多都更大.任何超过几K的东西都保证是英文的.
问题领域是生物医学文本挖掘,因此我们有时处理广泛且极大的语料库,就像所有PubMedCentral的Open Access资源库一样.一个相当庞大的文件是BioThesaurus 6.0,为5.7千兆字节.这个文件特别烦人,因为它几乎都是UTF-8.但是,我相信,有些numbskull会在其中插入几行8位编码 - 微软CP1252.在你旅行之前需要一段时间.:(
我试图使用UTF-8并遇到麻烦.
我尝试了很多东西; 这是我得到的结果:
????而不是亚洲人物.即使是欧洲文本,我也得到Se?or了Señor.Señor或新浪新闻为????.Sefor Señor.我究竟做错了什么?我该如何修复代码?我可以恢复数据,如果是,如何恢复?
我正在尝试在处理文本时将所有类型的智能引号转换为常规引号.但是,我编译的以下功能似乎仍然缺乏支持和正确的设计.
有谁知道如何正确地转换所有引用字符?
function convert_smart_quotes($string)
{
$quotes = array(
"\xC2\xAB" => '"', // « (U+00AB) in UTF-8
"\xC2\xBB" => '"', // » (U+00BB) in UTF-8
"\xE2\x80\x98" => "'", // ‘ (U+2018) in UTF-8
"\xE2\x80\x99" => "'", // ’ (U+2019) in UTF-8
"\xE2\x80\x9A" => "'", // ‚ (U+201A) in UTF-8
"\xE2\x80\x9B" => "'", // ? (U+201B) in UTF-8
"\xE2\x80\x9C" => '"', // “ (U+201C) in UTF-8
"\xE2\x80\x9D" => '"', // ” (U+201D) in UTF-8
"\xE2\x80\x9E" => '"', // „ (U+201E) …Run Code Online (Sandbox Code Playgroud) RFC 3986声明新的URI方案应该在编码百分比之前首先编码为UTF-8.但是,这不适用于以前的URI版本.
是否可以安全地假设所有多字节,百分比编码的URI在传递之后变成UTF-8编码的字符串urldecode()?
例如,如果内容的$_SERVER['REQUEST_URI']百分比编码为:
/b%C3%BCch/w%C3%B6rterb%C3%BCch
Run Code Online (Sandbox Code Playgroud)
我将此字符串传递给后urldecode(),我应该有一个多字节字符串.但是我怎么知道字符串的编码是什么?在上面的例子中,它是UTF-8,但总是这样安全吗?
如果假设这样做是不安全的,有没有办法(除了mb_detect_encoding)检测字符串的编码?我已经检查了请求标头,它们似乎没有任何帮助.
在我的网站上有一个简单的textarea表单供人们发表评论.问题是有时候我会收到uft8中的信息,有时候会收到iso信息.有可能控制它吗?
也许我做错了什么,但是浏览器是否可能改变它发送的数据的编码?
谢谢
我的代码如下所示:
for file in glob.iglob(os.path.join(dir, '*.txt')):
print(file)
with codecs.open(file,encoding='latin-1') as f:
infile = f.read()
with codecs.open('test.txt',mode='w',encoding='utf-8') as f:
f.write(infile)
Run Code Online (Sandbox Code Playgroud)
我使用的文件用Latin-1编码(我无法用UTF-8打开它们).但我想在utf-8中编写生成的文件.
但是这个:
<Trans audio_filename="VALE_M11_070.MP3" xml:lang="español">
<Datos clave_texto=" VALE_M11_070" tipo_texto="entrevista_semidirigida">
<Corpus corpus="PRESEEA" subcorpus="ESESUMA" ciudad="Valencia" pais="España"/>
Run Code Online (Sandbox Code Playgroud)
取而代之的是(在gedit中):
<Trans audio_filename="VALE_M11_070.MP3" xml:lang="espa???????????`????????????????????????????
Run Code Online (Sandbox Code Playgroud)
如果我在终端上打印它,它显示正常.
当我使用LibreOffice Writer打开生成的文件时,我得到的更令人困惑的是:
<#T#r#a#n#s# (and so on)
Run Code Online (Sandbox Code Playgroud)
那么如何正确地将latin-1字符串转换为utf-8字符串?在python2中,它很容易,但在python3中,它似乎让我很困惑.
我尝试过这些不同的组合:
#infile = bytes(infile,'utf-8').decode('utf-8')
#infile = infile.encode('utf-8').decode('utf-8')
#infile = bytes(infile,'utf-8').decode('utf-8')
Run Code Online (Sandbox Code Playgroud)
但不知怎的,我总是以同样奇怪的输出结束.
提前致谢!
编辑:这个问题与评论中链接的问题不同,因为它涉及Python 3,而不是Python 2.7.
我在这里遇到了一个字符集问题.我正在开发一个使用sql server数据库的应用程序.数据库不是为这个应用程序创建的,它存在于它之前并且运行良好.我无法更改数据库上的任何内容,因为它太大而且被许多其他应用程序使用.
我已经完成了我的laravel 5应用程序的auth,所以我将创建一个视图并在此视图中显示已登录用户的名称.名称是:ADMINISTRADORDAACENTUAÇÃO.它使用一些特殊字符.
在我看来:
{!!Auth::user()->name!!}
Run Code Online (Sandbox Code Playgroud)
表明:
行政大楼ACENTUU O
但是在我的控制器中,在我返回视图之前,我做了:
die(\Auth::user()->name);
Run Code Online (Sandbox Code Playgroud)
它告诉我:
行政大楼ACENTUAÇÃO
我现在尝试在我的视图文件中执行此操作:
{!!Auth::user()->name!!}
<?php die();
Run Code Online (Sandbox Code Playgroud)
这很好用.它告诉我:
行政大楼ACENTUAÇÃO
它让我相信在解析视图之后laravel会发生错误.
我不知道为什么当我在控制器上死掉用户名时它运行良好,但是当我在视图上回显它的名字时它不起作用.
愿任何人帮助我吗?
PS:
<?php echo Auth::user()->name; ?>刀片标签.它不起作用.我想检测文件系统编码的操作系统是默认的,比如不同语言版本的Windows操作系统,它会使用不同的编码(iso-8859-1,ms950,big5,gb2312..etc)那么如何检测不同的操作系统在PHP编码?任何的想法?谢谢.
我会简短的.我的FTP函数返回错误的文件名编码
$conn_id = ftp_connect("site.com");
ftp_login($conn_id, "login", "pass");
ftp_pasv($conn_id, true);
$buff = ftp_nlist($conn_id, "./");
print_r($buff);
-> // result
array() {
[0]=> "??.txt"
}
Run Code Online (Sandbox Code Playgroud)
文件名具有Windows-1251编码.
我尝试通过nodejs连接到FTP,但它也返回令人毛骨悚然的东西 - òð.txt.
然而,我的桌面客户端(WinSCP)可以正常工作.
PS:我尝试使用utf8_encode - 但这也不适合我.
我正在开发 Laravel (v5.7) 应用程序,该应用程序将上传的 CSV(带有联系人)转换为数组,然后在调度作业类时将其作为参数传递。
以下是 CSV 文件的示例(支持的格式):
123456,Richard,Smith
654321,John,Doe
Run Code Online (Sandbox Code Playgroud)
上传 (CSV) 文件的处理方式如下:
123456,Richard,Smith
654321,John,Doe
Run Code Online (Sandbox Code Playgroud)
$file_path = $request->file_name->store('contacts');
$file = storage_path('app/' . $file_path);
$contactsIterator = $this->getContacts($file);
$contacts = iterator_to_array($contactsIterator); // Array of contacts from uploaded CSV file
Run Code Online (Sandbox Code Playgroud)
最后,$contacts数组被传递给一个被分派的作业:
ImportContacts::dispatch($contacts);
Run Code Online (Sandbox Code Playgroud)
这个作业类看起来像这样:
protected function getContacts($file)
{
$f = fopen($file, 'r');
while ($line = fgets($f))
{
$row = explode(",", $line);
yield [
'phone' => !empty($row[0]) ? trim($row[0]) : '',
'firstname' => !empty($row[1]) ? trim($row[1]) : '',
'lastname' => !empty($row[2]) ? trim($row[2]) …Run Code Online (Sandbox Code Playgroud)