# 嵌入式杂记

### stm32串口如何向PC的串口调试终端发送中文

> 1、在编程时需要使用支持中文的编码格式，例如UTF-8编码，确保中文字符被正确编码。
>
> 2、串口调试终端需要支持显示中文的编码格式，例如UTF-8编码。如果终端不支持UTF-8编码，需要在终端中设置正确的编码格式，否则中文字符会显示乱码。
>
> 注意两个编码格式需要一样，否则出错，例如在正点原子的串口调试终端使用的是GB2312编码格式，这个使用我使用UTF8区编写程序，这个时候虽然也能正常在程序文件中显示中文，但由于编码格式不用，编译生成的二进制其实对不上，就会造成在串口终端中文显示乱的现象（英文不受影响）

### 文件的编码

[ASCII，Unicode和UTF-8终于找到一个能完全搞清楚的文章了\_可变长编码\_Deft\_MKJing宓珂璟的博客-CSDN博客](https://blog.csdn.net/Deft_MKJing/article/details/79460485)

#### utf8 ascii gb2312 Unicode 之间是什么关系

这些都是字符编码的名称，用来表示文本中字符的二进制表示方式。下面简单介绍一下它们之间的关系：

1. ASCII 编码：ASCII 是一种最早的字符编码标准，只能表示英文字符、数字和一些特殊字符，共计 128 个字符，每个字符占用 7 位二进制数（1 字节）。因此，ASCII 编码是一种单字节编码。
2. UTF-8 编码：UTF-8 是一种 Unicode 字符编码方案，可以表示所有的 Unicode 字符，包括中文、日文、韩文等多种语言文字，是目前最常用的字符编码。UTF-8 编码采用可变长编码方式，一个字符可能占用 1 到 4 个字节。
3. GB2312 编码：GB2312 是一种双字节编码，只能表示中文字符，共计 6763 个字符。
4. Unicode 编码：Unicode 是一种字符编码标准，旨在统一世界上所有字符的编码方式，包括 ASCII、GB2312、日文、韩文等多种编码方式。Unicode 编码使用 2 个字节表示一个字符，字符集包含了全世界所有的字符，从 U+0000 到 U+10FFFF。 因此，UTF-8 编码是一种 Unicode 字符编码方案，可以表示所有的 Unicode 字符，而 ASCII 和 GB2312 只能表示局限范围内的字符。而 Unicode 编码则是一种字符集，包含了所有的字符。

#### txt文本是什么编码格式

可以选择在保存时设置保存的编码方式，我们试着在两个txt中都存入同一个字符 “我”，会发现utf8的占3字节，ANSI(对中文来说就是GB2312)占2字节。

#### vscode的通过编码重新打开和通过编码保存有什么区别

VS Code 中的“通过编码重新打开”和“通过编码保存”两个选项的区别如下：

1. 通过编码重新打开：该选项会重新打开当前文件并尝试以指定的编码格式读取文件内容。如果当前文件的编码格式与指定的编码格式不同，则会按照指定的编码格式重新解析文件内容。如果文件的编码格式无法确定，则会显示一个对话框，要求用户选择要使用的编码格式。
2. 通过编码保存：该选项会将当前文件保存为指定的编码格式。如果当前文件的编码格式与指定的编码格式不同，则会按照指定的编码格式重新编码文件内容。如果文件的编码格式无法确定，则会显示一个对话框，要求用户选择要使用的编码格式。 因此，通过编码重新打开和通过编码保存的主要区别在于它们对文件内容的处理方式。通过编码重新打开会尝试解析文件内容，而通过编码保存则会重新编码文件内容。
3. 简单来说，通过==编码重新打开==，只是改变你看到的模样，不会修改底下对应的二进制数据，而==通过编码保存==会修改对应的二进制数据，转化为新的编码格式下同一字符对应的二进制数据，保证在新的编码格式下显示同样的字符。
4. 实例：在scripts.py文件中使用GB2312编码写入一个汉字"我"，查看文件属性，发现占用大小为5字节，

   ```python
   "我"
   ```

   选上==通过编码重新打开==，编码格式选择utf8格式，发现显示乱码，但是文件大小没有任何变化，因为底层数据没有变化，无法被新的编码格式解析。

   ![image-20230329160606730](https://s2.loli.net/2023/03/29/v3tXT8c9L4lgIo7.png)

​ 这个时候先选择编码重新打开，编码格式选择GB2312，在正常显示GB2312后，选择 ==通过编码保存==，选择编码格式UTF8，此时还是正常显示，文件占用大小6字节，显然 底层数据发生了变换，将GB2312的“我”对应的16进制数CED2转化为UTF8 的“我”对应的E68891

![image-20230329160908205](https://s2.loli.net/2023/03/29/LBfovEZQ4s826pR.png)

#### Python的编码格式

python默认使用utf8格式编码，在编辑器中也尽量使用utf8格式，若实在需要使用gb2312，需要保证声明的编码格式与编辑器编码格式一致，否则错误，

* 反例一：

PYTHON3.8，在VSCODE中选择编码方式为GB2312（这里选择“**通过编码保存**”选项），代码中不声明编码格式，即使用默认的utf8编码

```python
b="严"
```

报以下错误

```c
SyntaxError: Non-UTF-8 code starting with '\xd1' 
```

其实“严”这个汉字在GB2312的16进制数据表示就是d1cf，也就是说由于将“严”使用GB2312编码为d1cf后，在python解释器按utf8解码后找不到对应的数据，因此报错。

* 正确的是

PYTHON3.8，在VSCODE中选择编码方式为GB2312（这里选择“通过编码保存”选项，注意如果不使用该选项，而是“通过编码重新打开”，实际保存时的编码格式并不会改变）

代码中编码格式

```python
# -*- coding: gb2312 -*-
b = "严"
```

代码正常执行。

\==值得注意的是==在PYTHON2中使用中文字符可以在字符前加'u',前缀（但其实不加u好像也没事，也可需要声明编码格式），因为在 Python 2.x 中，字符串默认采用 ASCII 编码，如果要使用 Unicode 字符串，需要在字符串前面加上 `u`，表示使用 Unicode 编码方式。

例如

```python
s=u"囧"
```

而在 Python 3.x 中，字符串默认采用 Unicode 编码，不需要再使用 `u` 前缀来表示 Unicode 字符串。因此，在 Python 3.x 中，直接使用 `"囧"` 即可表示一个 Unicode 字符串，与 `u"囧"` 的效果是一样的。

#### Python的encode和decode

encode是编码，将字符按对应的编码格式的二进制数据输出

decode是解码，与编码相反，将数据按编码格式解析，输出字符

* 实例：PYTHON3.8.8+UTF-8编码

```python
b="严"
print(b.encode("utf-8"))
print(b.encode("utf-8").decode("utf-8"))
print(b.encode("gb2312"))
print(b.encode("gb2312").decode("gb2312"))

```

输出

```bash
b'\xe4\xb8\xa5'
严
b'\xd1\xcf'
严
```

可以发现在执行encode时，实际上如果原字符的格式与encode选择的编码格式不符，==会进行转化==，将他转化为encode选择的编码格式下同一字符对应的二进制数据

* 实例PYTHON3.8.8+gb2312编码

```python
# -*- coding: gb2312 -*-
b="严"
print(b.encode("utf-8"))
print(b.encode("utf-8").decode("utf-8"))
print(b.encode("gb2312"))
print(b.encode("gb2312").decode("gb2312"))
```

输出不变

```bash
b'\xe4\xb8\xa5'
严
b'\xd1\xcf'
严
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://oceanaparts.gitbook.io/halnote/qian-ru-shi-za-ji.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
