{"id":16779715,"url":"https://github.com/lc044/mcu","last_synced_at":"2026-03-15T09:40:54.242Z","repository":{"id":47813596,"uuid":"515651354","full_name":"LC044/MCU","owner":"LC044","description":"使用microPython开发单片机","archived":false,"fork":false,"pushed_at":"2023-04-04T09:24:48.000Z","size":30545,"stargazers_count":33,"open_issues_count":1,"forks_count":12,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-24T18:21:37.479Z","etag":null,"topics":["esp32","mcu","micropython"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LC044.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-07-19T15:56:47.000Z","updated_at":"2025-01-10T02:24:56.000Z","dependencies_parsed_at":"2025-02-18T02:45:28.937Z","dependency_job_id":null,"html_url":"https://github.com/LC044/MCU","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LC044%2FMCU","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LC044%2FMCU/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LC044%2FMCU/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LC044%2FMCU/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LC044","download_url":"https://codeload.github.com/LC044/MCU/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248297011,"owners_count":21080309,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["esp32","mcu","micropython"],"created_at":"2024-10-13T07:31:56.781Z","updated_at":"2026-03-15T09:40:49.220Z","avatar_url":"https://github.com/LC044.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 单片机实现utf-8转gb2312\n\n 我们在单片机开发中常会遇到需要将UTF-8转换为GBK编码的需求。在了解各种编码格式的情况下可知， UFT-8不能直接转成GBK，需中转成unicode再转换为gbk。而unicode和gbk之间没有算法可以直接计算，需要查表方式获取。\n\n网上有一些C语言实现的代码，我这里分享一种microPython的实现代码\n\n接下来就是要考虑表的存储方式了，刚开始我想着把表存到代码里直接通过索引实现编码转换。但是gb2312有七千多个字符全部存储要耗费很大内存，即使是32位的esp32也只有512k的内存，加上其他资源的消耗，剩余的内存不足以存储编码转换表。\n\n于是只能将表保存成一个文件（转化成bin文件会比较好，方法类似），通过读写文件来减少内存开销。\n\n具体的查表就是简单的二分法\n\n\n## 代码实现：\n\n```python\nclass utf8_gb2312(object):\n    def __init__(self):\n        self.f = open('font.txt', 'r', encoding='utf-8')\n\n    def b2i(self, byte):  # bytes转int\n        r = 0\n        for i in range(len(byte)):\n            r = (r \u003c\u003c 8) + byte[i]\n        return r\n\n    def i2b(self, num):  # int转bytes\n        num = int(num, 16)\n        return num.to_bytes(2, 'big')\n\n    def one_char(self, char):  # 将一个字符转化成gb2312\n        utf_byte = char.encode('utf-8')\n        r = self.B_S(0, 7296, self.b2i(utf_byte))\n        gb2312_byte = self.i2b(r)\n        # print(gb2312_byte)\n        return gb2312_byte\n\n    def str(self, st):  # 将字符串转化成gb2312\n        r = b''\n        for s in st:\n            # print(s.encode('utf-8'))\n            if len(s.encode('utf-8')) \u003c= 1:\n                r += s.encode('utf-8')\n            else:\n                r += self.one_char(s)\n        return r\n\n    def B_S(self, low, high, m):  # 二分查找\n        if 0 \u003c= low \u003c= high \u003c= 7296:\n            mid = (low + high) // 2\n            self.f.seek(mid * 12)\n            data = self.f.read(12)\n            utf = data[0:6]\n            if int(utf, 16) \u003c m:\n                return self.B_S(mid + 1, high, m)\n            elif int(utf, 16) \u003e m:\n                return self.B_S(low, mid - 1, m)\n            else:\n                return data[7:-1]\n\n    def __del__(self):\n        self.f.close()\n\n\nif __name__ == '__main__':\n    font = utf8_gb2312()\n    r = font.one_char('起')\n    print(r.decode('gb2312'))\n    r = font.str('起风了Abc123-')\n    print(r)\n    print(r.decode('gb2312'))\n```\n\n## 附件下载地址：\n\nhttps://github.com/LC044/MCU\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flc044%2Fmcu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flc044%2Fmcu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flc044%2Fmcu/lists"}