Python源码格式转换

1.文件格式侦测 - file 命令

[root@localhost sensor]# find stress/*| xargs file
stress/bi:                                                         directory
stress/bi/dynamic_cycles.py:                                       UTF-8 Unicode text, with CRLF line terminators
stress/bi/dynamic_margin.py:                                       Python script, UTF-8 Unicode text executable, with CRLF line terminators

...

...

stress/bi/stress_trendency.py:                                     C++ source, ASCII text, with CRLF line terminators
stress/bi/__pycache__:                                             directory
stress/bi/__pycache__/dynamic_cycles.cpython-311.pyc:              data
stress/bi/__pycache__/dynamic_margin.cpython-311.pyc:              data

...

...
stress/common:                                                     directory
stress/common/gp_comb_filter_related.py:                           Python script, UTF-8 Unicode text executable, with CRLF line terminators
stress/common/gp_converter.py:                                     troff or preprocessor input, UTF-8 Unicode text, with CRLF line terminators
stress/common/gp_filter_lof.py:                                    Python script, UTF-8 Unicode text executable, with CRLF line terminators
stress/common/gp_helper.py:                                        Python script, UTF-8 Unicode text 
stress/stress.py:                                                  Python script, UTF-8 Unicode text executable, with very long lines, with CRLF line terminators
stress/trash_code.py:                                              ASCII text, with CRLF line terminators

file命令的功能好强大。它不仅可以显示字符集,也可以显示文件的回车换行是否正常。

2.格式转换

2.1  utf8转换

下面针对几个ASCII编码的源码文件,将其转为UTF-8先。字符集转换,使用命令行工具iconv即可:

iconv -f GBK -t UTF-8 "/workerspace/sensor/common/gp_converter.py" -o "/workerspace/sensor/stress
/gp_converter.py"

2.2  crlf转换

对于crlf的替换,可以使用下面这个.py程序,它可以对某个目录中的所有文件去掉回车换行:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# first version: v1.0.20231016 by fengxh&ChatGPT

import os
import subprocess

def gpIsFileAscIIEncoding(filepath):
        # 执行 file 命令,并捕获输出结果
        process = subprocess.Popen(["file", filepath], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        output, error = process.communicate()

        # 判断输出结果中是否包含 "ASCII" 字样
        if b"ASCII" in output:
            print("文件%s中包含 ASCII 字样" %(filepath))
            return True;
        else:
            #print("文件%s中不包含 ASCII 字样" %(filepath))
            return False;


# 指定待处理的文件夹路径
folder_path = "/xx/xxx/common"

# 获取当前脚本所在的目录路径
current_dir = os.path.dirname(os.path.abspath(__file__))

# 设置当前路径为当前脚本所在的目录
os.chdir(current_dir)

# 遍历文件夹中的所有文件
for filename in os.listdir(folder_path):
    file_path = os.path.join(folder_path, filename)

    # 判断是否为文件
    if os.path.isfile(file_path):
           with open(file_path, 'r') as file:
              content = file.read()

           # 替换换行符
           new_content = content.replace('\r\n', '\n')

           # 将修改后的内容写回原文件
           with open(file_path, 'w') as file:
              file.write(new_content)

原本打算在一个脚本里做完字符集转换和crlf->cr这两个动作,字符集转换那个步骤始终不成功。

附录A  unicoe字符集的知识

[root@localhost sensor]# iconv -f ASCII -t UTF-8 --verbose "trash_code.py" -o "trash_code.py.utf8" trash_code.py

[root@localhost sensor]# file trash*

trash_code.py: ASCII text

trash_code.py.utf8: ASCII text

[root@localhost sensor]#

根据你提供的命令和输出信息,看起来你正在将一个名为 “trash_code.py” 的 ASCII 文本文件转换为 UTF-8 编码。你使用了 iconv 命令,并使用了 ASCII 到 UTF-8 的转换选项。输出结果显示,原始文件和转换后的文件都被识别为 ASCII 文本文件。

>>怎么错了?

根据你提供的命令和输出信息,看起来转换过程没有出现错误。转换命令 iconv -f ASCII -t UTF-8 --verbose "trash_code.py" -o "trash_code.py.utf8" 指定将 “trash_code.py” 文件从 ASCII 编码转换为 UTF-8 编码,并将转换后的结果输出到 “trash_code.py.utf8” 文件中。输出结果显示两个文件都被识别为 ASCII 文本文件,这可能是因为转换后的文件内容在视觉上与原始文件相似。请说明具体的错误或不符合预期的情况,以便我更好地帮助你解决问题。

>>utf-8和ascii完全不同,对吧?

是的,UTF-8 和 ASCII 是不同的字符编码方案。

ASCII 是美国标准信息交换码,它定义了128个基本的字符,包括英文字母、数字和一些特殊字符。ASCII 仅使用一个字节(8位)来表示每个字符。

UTF-8 是一种可变长度的 Unicode 编码方案,它能够表示全球范围内的字符。UTF-8 使用可变长度的字节序列来表示不同的字符,英文字母和 ASCII 字符的编码与 ASCII 完全相同,仍然使用一个字节表示;而其他特殊字符和非 ASCII 字符则使用多个字节表示。

因此,UTF-8 是对 ASCII 编码的扩展,可以兼容 ASCII 编码,并且能够表示更多的字符。所以当你将一个 ASCII 编码的文件转换为 UTF-8 编码时,文件的内容在视觉上可能仍然相同,但实质上文件的编码方式已经改变了,可以支持更多种类的字符。

>>明白,谢谢!utf8中的双字节都用来表示什么?汉字是不是都位于3字节区?

在 UTF-8 编码中,双字节编码通常用于表示一些特殊字符、符号和一些非常用的字符。具体来说,UTF-8 中的双字节编码范围是 U+0080 至 U+07FF。

这个范围内包括了一些常用的西欧语言字符的扩展,如拉丁文扩展字母、重音符号和货币符号等。另外,一些亚洲文字的一部分也被编码在双字节范围内,如日文的假名片假名和一些常见的汉字。

至于汉字,UTF-8 编码中常用的汉字通常被编码为三个字节。具体的编码范围是 U+0800 至 U+FFFF。这部分编码包含了常用的汉字和一些其他语言的字符。

需要注意的是,UTF-8 是一种可变长度编码,所以字符的编码长度不是固定的,根据字符的 Unicode 码点值不同,编码长度也会不同。这使得 UTF-8 可以灵活地表示不同范围内的字符,并且能够节省存储空间。

>>utf-8 字符的最大的可能字节数是多少?

UTF-8 字符编码的最大字节数为4个字节。

UTF-8 编码使用不同长度的字节序列表示字符,其中包括1个、2个、3个和4个字节的字符编码。对于 Unicode 码点范围 U+0000 到 U+10FFFF,UTF-8 的编码方案可以表示所有字符。

具体分布如下:

  • 单字节:ASCII 字符,范围是 U+0000 到 U+007F。
  • 双字节:常见的拉丁文、希腊文、西里尔字母等,范围是 U+0080 到 U+07FF。
  • 三字节:包括一些汉字、日文假名和韩文字母,范围是 U+0800 到 U+FFFF。
  • 四字节:包括一些较罕见的字符和 Emoji 表情符号,范围是 U+10000 到 U+10FFFF。

需要注意的是,虽然 Unicode 码点范围是 U+0000 到 U+10FFFF,但实际上并不是所有的码点都有对应的字符。因此,实际使用的字符数量远远少于整个码点范围。

>>中间空缺的空洞用于什么目的?

Unicode 码点范围中的空洞是为了预留未来可能出现的字符而存在的。

由于 Unicode 的设计目标是覆盖全球范围内的字符,并且支持多种语言和符号系统,因此它的码点范围被分配到了相当大的范围内。然而,目前实际使用的字符数量远远少于整个范围,中间会出现空洞或未定义的码点。

这些空洞部分留给未来可能出现、尚未编码的字符使用。随着语言的发展和新字符的引入,Unicode Consortium负责制定 Unicode 标准的组织,会根据需求将新的字符或符号添加到空洞中。

通过预留空洞,Unicode 可以在一定程度上保持扩展性,以适应未来可能出现的字符需求,同时也确保了现有的字符不会受到后续字符的影响或破坏编码的一致性。

>>它包括所有的繁体中文吗?

是的,Unicode 包括了繁体中文字符。

Unicode 为了能够支持全球范围内的字符,包括了几乎所有的语言和符号系统,其中也包括了繁体中文字符。繁体中文字符包括了繁体字、繁体字变体和一些特殊的标点符号、注音符号等。

这些繁体中文字符在 Unicode 中分布在不同的码点范围内,使用 UTF-8 编码时,繁体中文字符通常被编码为三个字节的序列。

Unicode 提供了不同的字形变体来表示不同的繁体中文字符,可以通过正确的字符编码来显示和处理繁体中文文本。这使得繁体中文能够进行跨平台和跨系统的交流和共享。

>>有4字节表征的汉字吗?简体或者繁体?

在 Unicode 中,确实存在一些特定的汉字字符需要使用四个字节来表示。这些四字节编码的汉字通常属于较为罕见或生僻的汉字,并且常用的汉字大多数都能使用三字节进行表示。

这些四字节编码的汉字编码范围是 U+10000 到 U+10FFFF。它们属于 Unicode 的增补平面,也被称为“增补字符”。这个平面中的字符包括了一些少数民族文字、罕见的汉字变体、历史上的繁体字以及一些特殊符号。

需要注意的是,这些四字节编码的汉字通常不是常规情况下所使用的简体或繁体字符。对于绝大多数简体和繁体汉字,它们通常在 Unicode 中用三字节进行表示。四字节编码主要用于非常特殊的汉字和其他字符。

>>在设计字库时,它与字符集之间的转换关系,由谁负责?

在设计字库时,将字符集与相应的字形进行映射和转换的任务由字库设计师或字体设计师负责。

字库或字体是一种包含了各个字符的可视化呈现(字形)的集合。字库中的每个字符都需要与字符集中的相应字符进行对应,以便在文档、操作系统、应用程序等场景中正确地显示和处理文本数据。

字库设计师或字体设计师需要根据字符集的规范和标准,确定每个字符的编码和字形,并创建相应的字型文件。这个过程通常涉及独特的字体设计和字形轮廓的绘制,确保每个字符在不同的显示设备上以一致的方式呈现。

在很多情况下,Unicode 字符集被广泛采用作为字符编码的标准,并与常见的字体格式(如TrueType、OpenType等)关联。这样,字库设计师可以利用这些标准来确保字符和字形之间的正确映射和转换。

总之,字符集与字库之间的转换关系是由字库设计师或字体设计师负责协调和实现的。

>>utf-8和unicode似乎是两个概念?不同的字符集标准?

是的,UTF-8和Unicode确实是两个不同的概念,它们代表了不同的字符集标准。

Unicode是一种字符集标准,旨在涵盖世界上所有的字符,并为每个字符分配一个唯一的编码值,即码点。Unicode可以表示各种语言的字符,符号,标点符号和其他特殊字符。通过使用Unicode,可以实现全球范围内的文本交流和数据处理的一致性。

而UTF-8(Unicode Transformation Format-8)是一种Unicode字符编码方案,用于在计算机系统中以字节序列的形式存储和传输Unicode字符。它是针对Unicode字符集设计的一种可变长度编码方案,能够有效地表示Unicode字符集的所有字符。

UTF-8使用1到4个字节来表示不同的字符,其中ASCII字符使用一个字节表示,而其他Unicode字符则使用多个字节表示,字节的数量取决于字符的码点大小。UTF-8编码方案的优点是兼容ASCII标准,支持一致的字符表示,同时也实现了对Unicode字符集的高效编码和压缩。

因此,Unicode是一个字符集标准,定义了字符和编码值的对应关系,而UTF-8是Unicode的一种具体的字符编码方案,用于实现Unicode字符在计算机系统中的存储和传输

>>utf8是为了让unicode存储时节省空间,而设计的一种存储或者传输格式,对吧?

是的,你理解得很正确。

UTF-8 是为了在存储和传输Unicode字符时节省空间而设计的一种编码格式。它的设计目标是兼容ASCII字符集,使得纯英文文本在使用UTF-8编码后的存储空间与使用传统ASCII编码相同。对于非英文字符和较少使用的字符,UTF-8 使用多个字节来表示对应的Unicode字符编码,以便满足Unicode字符集的全部需求。

UTF-8 的变长编码特性使得它可以有效地表示各种字符,随着字符的范围增加,使用的字节长度也会相应增加。对于常用的 ASCII 字符,UTF-8 使用一个字节表示,而对于较少使用的 Unicode 字符,UTF-8 使用多个字节表示。这种设计可以节省存储空间和传输带宽,同时保持了对 Unicode 字符集的广泛支持。

因此,UTF-8 可以看作是一种在存储和传输过程中节省空间的、可变长度的编码格式,目的是为了更高效地处理和表示 Unicode 字符。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子正

thanks, bro...

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值