相关疑难解决方法(0)

如何可靠地猜测MacRoman,CP1252,Latin1,UTF-8和ASCII之间的编码

在工作中似乎没有一周没有一些编码相关的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文件.这些尤其是一个问题.

一段时间以来,我一直在寻找一种方法来以编程方式确定哪一个

  1. ASCII
  2. ISO-8859-1
  3. CP1252
  4. 的MacRoman
  5. UTF-8

文件在,我还没有找到一个程序或库,可以可靠地区分这三种不同的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.在你旅行之前需要一段时间.:(

python java macos perl character-encoding

97
推荐指数
4
解决办法
1万
查看次数

UTF-8字符有问题; 我看到的不是我存储的东西

我试图使用UTF-8并遇到麻烦.

我尝试了很多东西; 这是我得到的结果:

  • ????而不是亚洲人物.即使是欧洲文本,我也得到Se?orSeñor.
  • 奇怪的胡言乱语(Mojibake?)如Señor新浪新闻????.
  • 黑色钻石,如Se or.
  • 最后,我陷入了数据丢失或至少被截断的情况:Sefor Señor.
  • 即使我看到正确的文字,它也没有正确排序.

我究竟做错了什么?我该如何修复代码?我可以恢复数据,如果是,如何恢复?

mysql unicode utf-8 character-encoding mariadb

66
推荐指数
3
解决办法
3万
查看次数

使用PHP转换所有类型的智能引号

我正在尝试在处理文本时将所有类型的智能引号转换为常规引号.但是,我编译的以下功能似乎仍然缺乏支持和正确的设计.

有谁知道如何正确地转换所有引用字符

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)

html php unicode replace double-quotes

22
推荐指数
2
解决办法
2万
查看次数

假设解码的百分比编码的URI变成UTF-8是否安全?

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)检测字符串的编码?我已经检查了请求标头,它们似乎没有任何帮助.

php uri http

15
推荐指数
1
解决办法
1297
查看次数

php表单提交utf8?

在我的网站上有一个简单的textarea表单供人们发表评论.问题是有时候我会收到uft8中的信息,有时候会收到iso信息.有可能控制它吗?

也许我做错了什么,但是浏览器是否可能改变它发送的数据的编码?

谢谢

html php encoding

9
推荐指数
1
解决办法
4万
查看次数

Python3:将Latin-1转换为UTF-8

我的代码如下所示:

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.

python encoding utf-8 python-3.5

9
推荐指数
1
解决办法
4947
查看次数

Laravel 5 charset在视图上无法正常工作.但是当我从控制器转储它时,它运行良好

我在这里遇到了一个字符集问题.我正在开发一个使用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:

  • 我的视图文件使用的是utf8字符集
  • 我试图用和没有html标签和charset meta回声.两种情况都会出现问题
  • 我试图删除我的视图文件并使用utf8 charset创建一个新文件.它不起作用.
  • 我尝试使用<?php echo Auth::user()->name; ?>刀片标签.它不起作用.

php utf-8 character-encoding laravel laravel-5

8
推荐指数
1
解决办法
1万
查看次数

如何在php中检测操作系统编码?

我想检测文件系统编码的操作系统是默认的,比如不同语言版本的Windows操作系统,它会使用不同的编码(iso-8859-1,ms950,big5,gb2312..etc)那么如何检测不同的操作系统在PHP编码?任何的想法?谢谢.

php

7
推荐指数
1
解决办法
2604
查看次数

PHP - FTP文件名编码问题

我会简短的.我的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 - 但这也不适合我.

php ftp encoding

7
推荐指数
1
解决办法
5723
查看次数

Laravel:无法对​​有效负载进行 JSON 编码。错误代码:5

我正在开发 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)

php csv mongodb-php laravel laravel-queue

6
推荐指数
1
解决办法
6116
查看次数