AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 10252
Accepted
Peter.O
Peter.O
Asked: 2010-10-30 04:46:19 +0800 CST2010-10-30 04:46:19 +0800 CST 2010-10-30 04:46:19 +0800 CST

gedit不能识别字符编码,但gvim可以

  • 772

我有很多来自 Windows 环境的纯文本文件。
他们中的许多人使用古怪的默认 Windows 代码页,既不是 ASCII(7 位)也不是 UTF-8。

gvim打开这些文件没有问题,但gedit不能这样做。
gvim将编码报告为latin1。

我假设gvim正在对代码页做出“智能”假设。
(我相信这个代码页仍然有国际变体)。

一些问题由此产生:

  • (1)。有什么方法可以告诉gedit识别这个代码页吗?
    **注意。[更新] 对于这一点 (1),请参阅下面的我的回答。
    ** 对于第 (2) 和 (3) 点。见奥利的回答。

  • (2)。有没有办法扫描文件系统来识别这些问题文件?

  • (3)。是否有批量转换工具将这些文件转换为 UTF-8?

(.. 这个旧世界的文本混乱实际上是把我带到 Ubuntu 的最后一根稻草......默认情况下 UTF-8 系统范围Brilliant)

[更新]
**注意: **我现在认为以下更新部分无关紧要,因为“问题”文件不是“问题”(请参阅​​下面的答案)。
我把它留在这里,因为它可能对某人有一些一般用途。


我已经制定了一种粗略且现成的方法来识别问题文件...
该file命令不合适,因为它将我的示例文件识别为 ASCII...但是 ASCII 文件是 100% UTF-8 兼容...

正如我在下面的评论中提到的,对 UTF-8 代码点 的无效第一个字节的测试是:

  • 如果(UTF-8 代码点的)第一个字节介于 0x80 和 0xBF(为其他字节保留)或大于 0xF7(“超长形式”)之间,则认为是错误

我知道sed(有点,通过 Win32 端口),所以我设法拼凑了一个 RegEx 模式,它可以找到这些违规字节。

这是一条丑陋的线,所以如果正则表达式吓到你,请立即移开视线 :)

如果有人指出如何在范围 []表达式中使用十六进制值,我将不胜感激。我刚刚使用了or运算符\|

fqfn="/my/fully/qualified/filename"  
sed -n "/\x80\|\x81\|\x82\|\x83\|\x84\|\x85\|\x86\|\x87\|\x88\|\x89\|\x8A\|\x8B\|\x8C\|\x8D\|\x8E\|\x8F\|\x90\|\x91\|\x92\|\x93\|\x94\|\x95\|\x96\|\x97\|\x98\|\x99\|\x9A\|\x9B\|\x9C\|\x9D\|\x9E\|\x9F\|\xA0\|\xA1\|\xA2\|\xA3\|\xA4\|\xA5\|\xA6\|\xA7\|\xA8\|\xA9\|\xAA\|\xAB\|\xAC\|\xAD\|\xAE\|\xAF\|\xB0\|\xB1\|\xB2\|\xB3\|\xB4\|\xB5\|\xB6\|\xB7\|\xB8\|\xB9\|\xBA\|\xBB\|\xBC\|\xBD\|\xBE\|\xBF\|\xF8\|\xF9\|\xFA\|\xFB\|\xFC\|\xFD\|\xFE\|\xFF/p" "${fqfn}"  

所以,我现在将其移植到Oli 的批处理解决方案中......谢谢 Oli!

PS。这是它在我的示例文件中找到的无效 UTF-8 字节……
“H.Bork,Gøte-borg。” ... "ø" = F8 hex ...这是一个无效的 UTF-8 字符。

gedit gvim utf-8 ascii
  • 4 4 个回答
  • 11059 Views

4 个回答

  • Voted
  1. Best Answer
    Oli
    2010-10-30T05:10:37+08:002010-10-30T05:10:37+08:00

    iconv可能是您想要使用的。iconv -l将向您显示可用的编码,然后您可以使用几个命令对它们进行重新编码:

    # all text files are in ./originals/
    # new files will be written to ./newversions/
    
    mkdir -p newversions
    cd originals
    for file in *.txt; do
        cat $file | iconv -f ASCII -t utf-8 > ../newversions/$file;
    done
    

    如果您想对没有编码的文件执行此操作(因为它们到处都是),您需要引入更多命令:find、file和. 最后两个只是用来处理文件的输出。awksed

    for file in find . -type f -exec file --mime {} \; | grep "ascii" | awk '{print $1}' | sed s/.$//; do
        ...
    

    我不知道这是否真的有效,所以我当然不会从你拥有的最不重要的目录运行它(创建一个包含一些已知 ASCII 文件的测试文件夹)。find 的语法可能会阻止它在 for 循环中。我希望其他有更多 bash 经验的人可以跳到那里并对其进行整理,以便它做正确的事情。

    • 4
  2. skarmoutsosv
    2014-02-25T07:22:23+08:002014-02-25T07:22:23+08:00

    只有在“文件-打开-字符编码”中列出的时候,Gedit 才能检测到正确的字符集。您可以更改此列表,但请记住顺序很重要。

    • 1
  3. Peter.O
    2010-10-30T09:32:24+08:002010-10-30T09:32:24+08:00

    这个问题我想多了……

    是的,“ø” = 0xF8 hex* 绝对是gedit无法打开文件的原因......
    为什么?因为它不是有效的 UTF-8 字节。
    默认情况下,gedit只会打开 UTF-8 文件...

    但是,gedit确实具有代码页自动检测功能,但您必须首先将代码页添加到其“可能”列表中。

    当gedit无法识别代码页时出现的鲜红色对话框,上面有一个按钮,允许您添加另一个代码页...

    问题解决了!...几乎...

    这个棘手的问题现在再次抬头......它是哪个代码页?

    在我的情况下,我可以合理地假设它是标准的英文 Windows 代码页(对于我的地区?还是对于文件来源的地区?.. 我确实提到了“knarly”:)....

    无论如何,一旦您将代码页添加到其列表中 , gedit将允许您加载文件......

    因此,尽管所有终端命令本身都是有用且有趣的,但这种思路似乎走错了路。

    这些文件本质上没有任何问题......
    问题似乎纯粹是关于代码页。

    gedit可以打开文件,就像gvim一样。
    ...但必须首先将相关代码页添加到其代码页列表中。
    例如。通过文件打开对话框,或我遇到的红色警告对话框。

    • 0
  4. flaja94
    2018-03-28T08:36:12+08:002018-03-28T08:36:12+08:00

    您可以使用以下 3 个命令行中的任何一个:

    gedit --encoding=utf-8 filename
    gedit --encoding=iso-8859-15 filename
    gedit --encoding=utf-16 filename
    . . . . .
    
    • 0

相关问题

  • 真正的列模式(块选择和编辑)文本编辑器解决方案?

  • 如何使用 gvim 的颜色方案修复错误?[关闭]

  • 如何在 gVim 中保存字体选择?

  • 支持 gedit 中的各种功能

  • Gedit 中是否支持拆分窗格?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何安装 .run 文件?

    • 7 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    如何获得 CPU 温度?

    • 21 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Marko Smith

    如何使用命令行将用户添加为新的 sudoer?

    • 7 个回答
  • Marko Smith

    更改文件夹权限和所有权

    • 9 个回答
  • Marko Smith

    你如何重新启动Apache?

    • 13 个回答
  • Marko Smith

    如何卸载软件?

    • 11 个回答
  • Marko Smith

    如何删除 PPA?

    • 26 个回答
  • Martin Hope
    NES 如何启用或禁用服务? 2010-12-30 13:03:32 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    Olivier Lalonde 如何在结束 ssh 会话后保持进程运行? 2010-10-22 04:09:13 +0800 CST
  • Martin Hope
    David B 如何使用命令行将用户添加为新的 sudoer? 2010-10-16 04:02:45 +0800 CST
  • Martin Hope
    Hans 如何删除旧内核版本以清理启动菜单? 2010-08-21 19:37:01 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve