VSCode怎么写C乱码_VSCode C语言编码问题解决教程

乱码问题源于编码不一致,需统一VSCode文件编码、编译器输入输出编码及终端显示编码。首先将VSCode的files.encoding设为utf8,并转换已有文件为UTF-8;在tasks.json中为GCC添加-finput-charset=UTF-8和-fexec-charset=GBK(或UTF-8)以匹配源码与输出编码;在Windows终端运行chcp 65001切换为UTF-8代码页,或在settings.json中配置终端启动时自动执行该命令,确保终端与程序输出编码一致;跨平台项目建议全程使用UTF-8,避免因系统差异导致乱码;同时注意setlocale的使用场景,避免混淆源码编码与运行时编码。

vscode怎么写c乱码_vscode c语言编码问题解决教程

VSCode里写C语言遇到乱码,这事儿真挺让人抓狂的。说白了,它通常就是编码不一致惹的祸。核心解决思路是确保你的源代码文件编码、VSCode编辑器本身的编码设置、C/C++编译器的输入输出编码,以及你运行程序时所使用的终端(命令行)的显示编码,这几者之间能达成某种统一。最省心的办法,往往是让它们都向UTF-8靠拢,尤其是在现代开发环境中,UTF-8几乎是通用标准了。但如果你在Windows下,并且程序需要和系统默认的GBK(或GB2312)环境交互,那可能还需要一些特别的策略来桥接。

解决方案

解决VSCode中C语言乱码问题,我们需要从几个关键点入手,确保整个开发链条的编码一致性。这包括了VSCode的文件编码设置、C/C++编译器的编码参数,以及运行程序时所用终端的编码环境。

统一VSCode文件编码:

打开VSCode的设置(

Ctrl+,

File -> Preferences -> Settings

)。搜索

files.encoding

,将其设置为

utf8

。这是一个全局设置,确保新创建的文件默认就是UTF-8编码。对于已有的乱码文件,可以右下角点击编码类型(通常显示为UTF-8或GBK),选择“通过编码重新打开(Reopen with Encoding)”,然后选择正确的编码(比如GBK),如果内容正常了,再选择“通过编码保存(Save with Encoding)”,保存为UTF-8。这样就将旧文件转换成了UTF-8。建议勾选

files.autoGuessEncoding

,让VSCode尝试自动识别文件编码,但这并非万能,手动设置更可靠。

配置C/C++编译器编码(以GCC/MinGW为例):

立即学习“C语言免费学习笔记(深入)”;

你需要修改编译任务(通常是

.vscode/tasks.json

)或者C/C++插件的配置。在GCC/MinGW的编译命令中,加入编码相关的参数:

-finput-charset=UTF-8

:告诉编译器你的源代码文件是UTF-8编码的。

-fexec-charset=GBK

-fexec-charset=UTF-8

:这决定了程序运行时输出到控制台的字符编码。如果你在Windows下使用默认的CMD/PowerShell(它们通常是GBK编码),那么

-fexec-charset=GBK

可能更合适,这样程序输出的GBK字符就能被终端正确显示。如果你的终端环境已经配置为UTF-8,那么使用

-fexec-charset=UTF-8

会更一致。示例(

tasks.json

command

部分):

"command": "gcc -g ${file} -o ${fileDirname}\${fileBasenameNoExtension}.exe -finput-charset=UTF-8 -fexec-charset=GBK",

请根据你的实际需求选择

-fexec-charset

的参数。

设置终端编码:

Windows CMD/PowerShell: 默认编码是GBK(代码页936)。要使其支持UTF-8,可以在每次运行程序前输入

chcp 65001

。你可以在

tasks.json

command

中,在实际编译命令前加上这个命令:

"command": "chcp 65001 && gcc -g ${file} -o ${fileDirname}\${fileBasenameNoExtension}.exe -finput-charset=UTF-8 -fexec-charset=UTF-8",

注意,如果终端设置为UTF-8(

chcp 65001

),那么编译器的

-fexec-charset

也应该设置为

UTF-8

,这样才能保持一致。

或者,你可以在VSCode的

settings.json

中配置集成终端的启动命令,让它每次启动时都执行

chcp 65001

"terminal.integrated.profiles.windows": {    "PowerShell": {        "source": "PowerShell",        "icon": "terminal-powershell",        "args": ["-NoExit", "/c", "chcp 65001"] // For PowerShell    },    "Command Prompt": {        "path": "cmd.exe",        "args": ["/k", "chcp 65001"] // For CMD    }},"terminal.integrated.defaultProfile.windows": "PowerShell" // 或 "Command Prompt"

Git Bash / WSL / Linux / macOS: 这些终端环境通常默认就是UTF-8,所以问题相对较少。如果遇到乱码,检查一下

LANG

环境变量,确保它包含

UTF-8

(例如

en_US.UTF-8

)。

为什么VSCode C语言代码会显示乱码?

说实话,乱码这东西,它不是凭空出现的,背后总有那么几条“编码不一致”的线索。在VSCode里写C语言遇到乱码,通常可以归结为以下几个核心原因:

首先,最常见的就是文件本身的编码与VSCode编辑器解读方式不符。你可能在某个默认GBK的环境下创建了C文件,或者从某个老项目拷贝过来,文件内容实际是GBK编码。但VSCode默认或你设置为UTF-8来打开它,那它就懵了,把GBK的字节序列当成UTF-8来显示,结果自然就是一堆奇奇怪怪的符号。反过来也一样,如果文件是UTF-8,但VSCode被强制用GBK去读,也会乱。

其次,是源代码编码与编译器期望的输入编码不匹配。我们写代码,尤其是涉及到中文字符串字面量的时候,比如

printf("你好,世界!");

,这些字符在源代码文件中是以某种编码形式存在的。当你把这个文件交给GCC这样的编译器处理时,编译器需要知道它应该用哪种编码来解析这些字符。如果源代码是UTF-8,但编译器却默认按GBK去读(或者没有明确告知),那么它在处理字符串字面量时就会出错,导致编译出来的程序在运行时输出乱码。

再者,也是非常关键的一点,是程序运行时输出的编码与终端显示编码不一致。你的C程序编译后,运行时会向标准输出(通常是你的命令行终端)打印字符。这些字符在程序内部是以某种编码形式(比如GBK或UTF-8)生成的。但如果你的终端(比如Windows的CMD)默认是GBK,而程序却试图输出UTF-8字符,那终端就无法正确解释这些UTF-8字节,于是,你看到的又是一片乱码。反之亦然,如果程序输出GBK,但终端被强制设置为UTF-8,同样会乱。这就像两个人说不同语言,却指望对方能听懂一样。

简单来说,乱码就是“鸡同鸭讲”的数字世界版本。文件、编辑器、编译器、终端,它们之间只要有一个环节的编码约定不一致,整个链条就可能断裂,最终呈现在你眼前的就是那些让人头疼的“?”或者方块。

如何统一VSCode、编译器和终端的编码设置?

要彻底解决C语言乱码问题,核心在于“统一”。我们得把VSCode、编译器和终端这三个环节的编码设置都捋顺了,让它们彼此能“说同一种语言”。

首先,VSCode文件编码的统一。这是最直观的。打开VSCode的设置(

Ctrl + ,

),找到

files.encoding

,我个人强烈建议你把它设为

utf8

。这是一个现代且通用的选择,能最大程度避免跨平台问题。对于已经存在的代码文件,如果它现在显示乱码,那很可能是它并非UTF-8编码。你可以点击VSCode右下角的编码提示(比如可能显示

GBK

UTF-8

),选择“通过编码重新打开”,尝试

GBK

GB2312

Big5

,直到内容正常显示。一旦正常,立即选择“通过编码保存”,并选择

UTF-8

。这样,你的所有源代码文件就都统一到UTF-8了。记得勾选

files.autoGuessEncoding

,让VSCode尝试智能识别,但别完全依赖它,它有时也会犯迷糊。

码上飞 码上飞

码上飞(CodeFlying) 是一款AI自动化开发平台,通过自然语言描述即可自动生成完整应用程序。

码上飞 138 查看详情 码上飞

接下来,C/C++编译器的编码配置。以最常用的GCC/MinGW为例,你需要告诉它你的源代码是UTF-8,并且程序运行时输出的字符应该用什么编码。这通常在

.vscode/tasks.json

里配置你的编译任务时完成。比如,你的

command

字段可能是这样的:

"command": "gcc -g ${file} -o ${fileDirname}\${fileBasenameNoExtension}.exe -finput-charset=UTF-8 -fexec-charset=GBK",

这里的关键是:

-finput-charset=UTF-8

:这告诉GCC,它正在读取的C源文件(

*.c

)是UTF-8编码的。这样,源代码中的中文字符串字面量就能被正确解析。

-fexec-charset=GBK

:这决定了你的程序在运行时,如果使用

printf

等函数输出中文字符串,这些字符串会被转换成GBK编码。这个参数的选择非常重要,它需要和你的终端显示编码匹配。如果你在Windows下使用默认的CMD或PowerShell,它们通常是GBK编码环境,那么输出GBK字符就能被正确显示。

最后,也是很多新手容易忽略的,终端的编码环境。你的程序编译运行后,会把结果输出到终端。如果终端的显示编码和程序输出的编码不一致,那肯定又是一堆乱码。在Windows上,CMD和PowerShell默认是GBK(代码页936)。为了让它们能正确显示UTF-8字符,你需要在运行程序前执行

chcp 65001

命令。这个命令会将当前终端的代码页设置为UTF-8。你可以选择两种方式来应用它:

tasks.json

command

中添加前缀:

"command": "chcp 65001 && gcc -g ${file} -o ${fileDirname}\${fileBasenameNoExtension}.exe -finput-charset=UTF-8 -fexec-charset=UTF-8",

注意,如果这里你用了

chcp 65001

,那么编译器的

-fexec-charset

也应该改为

UTF-8

,这样程序输出UTF-8,终端也显示UTF-8,完美匹配。

配置VSCode集成终端的启动参数:

settings.json

中,你可以为Windows的PowerShell或CMD配置一个启动脚本,让它们每次启动时都自动执行

chcp 65001

"terminal.integrated.profiles.windows": {    "PowerShell_UTF8": {        "path": "pwsh.exe", // 或 "powershell.exe"        "args": ["-NoExit", "-Command", "chcp 65001"],        "icon": "terminal-powershell"    },    "Command Prompt_UTF8": {        "path": "cmd.exe",        "args": ["/k", "chcp 65001"],        "icon": "terminal-cmd"    }},"terminal.integrated.defaultProfile.windows": "PowerShell_UTF8" // 或者 "Command Prompt_UTF8"

这样,每次打开集成终端,它就已经是UTF-8模式了。

通过这些步骤,我们就能建立一个从源代码到编辑器,再到编译器,最后到终端的完整、统一的编码链路,大大减少乱码的发生。

处理C语言乱码时常见的误区和高级技巧有哪些?

处理C语言乱码,很多时候并不是一蹴而就的,它涉及的环节比较多,所以也容易踩坑。同时,也有一些更深入的技巧可以帮助我们更好地管理字符编码。

常见的误区:

只关注文件编码,忽略编译器或终端: 这是一个最常见的误区。很多人会把VSCode的文件编码设成UTF-8,看到文件里中文显示正常就觉得万事大吉了。结果一编译运行,终端还是乱码。这是因为文件编码只是解决了编辑器显示的问题,但编译器如何解析字符串字面量、程序如何输出字符,以及终端如何显示,这些都是独立但又相互关联的环节,缺一不可。盲目使用

setlocale

setlocale(LC_ALL, "");

这个函数确实能让C程序根据当前系统的本地化设置来处理字符,但这并非万能药。在Windows上,如果系统区域设置是中文(中国),那么

setlocale

通常会将本地化设置为GBK。如果你的源文件是UTF-8,并且程序输出也是UTF-8,那么

setlocale

反而可能导致输出到GBK终端的UTF-8字符再次乱码,因为它会尝试将UTF-8字符转换为GBK。它的作用是让程序适应系统环境,而不是强制统一编码。混淆源代码编码和运行时输出编码: 很多人以为只要源代码是UTF-8,程序输出就一定是UTF-8。但实际上,C语言的字符串字面量在编译阶段就已经被处理成某种编码形式(由编译器参数决定),并且

printf

等函数在输出时也可能根据

setlocale

或系统环境进行转换。所以,需要明确区分源代码文件本身的编码、编译器处理字符串字面量时的编码,以及程序运行时输出到终端的编码。

高级技巧:

使用宽字符和宽字符串(

wchar_t

L"字符串"

): 对于需要真正实现国际化或者处理多字节字符的C程序,直接使用

char

和普通字符串可能会非常麻烦。C标准库提供了宽字符类型

wchar_t

和对应的宽字符串字面量(

L"你好"

),以及

wprintf

wcslen

等宽字符函数。

#include #include  // For wchar_t and wprintf#include  // For setlocaleint main() {    setlocale(LC_ALL, ""); // 根据系统本地化设置    wprintf(L"你好,世界!");    return 0;}

使用

wchar_t

可以更好地处理不同编码的字符,但它需要与

setlocale

配合,并且输出到终端时,终端也需要支持相应的宽字符编码。在Windows下,

wchar_t

通常是UTF-16,而在Linux下通常是UTF-32。这增加了跨平台时的复杂性,但提供了更强大的字符处理能力。

深入理解

setlocale(LC_ALL, "")

这个函数会尝试将程序的本地化环境设置为操作系统当前的默认本地化。在中文Windows系统上,这通常意味着程序会按照GBK编码来处理字符。如果你希望程序在UTF-8环境下运行,并且输出也是UTF-8,那么你可能需要显式地设置

setlocale(LC_ALL, "en_US.UTF-8")

(在支持UTF-8的系统上,如Linux/macOS)或者不使用

setlocale

,而是通过编译器和终端设置来强制UTF-8。

跨平台项目优先UTF-8: 如果你的C项目需要在Windows、Linux、macOS等多个平台运行,那么从一开始就坚持所有源文件、所有输出都采用UTF-8是最佳策略。在Linux/macOS上,UTF-8是默认且普遍支持的。在Windows上,通过前面提到的编译器参数和终端

chcp 65001

来强制UTF-8。这样可以最大限度地减少平台间的编码差异。

tasks.json

中的环境变量和命令链:

tasks.json

中,你可以利用

options.env

来设置环境变量,或者使用

&&

操作符连接多个命令。例如,在Windows上,你可以在编译命令前先执行

chcp 65001

,确保后续的编译和运行都在UTF-8环境下。

// .vscode/tasks.json 示例{    "label": "build and run C (UTF-8 on Windows)",    "type": "shell",    "command": "chcp 65001 && gcc -g ${file} -o ${fileDirname}\${fileBasenameNoExtension}.exe -finput-charset=UTF-8 -fexec-charset=UTF-8 && ${fileDirname}\${fileBasenameNoExtension}.exe",    "options": {        "cwd": "${fileDirname}"    },    "group": {        "kind": "build",        "isDefault": true    },    "problemMatcher": "$gcc"}

这个例子中,

chcp 65001

先设置终端编码,然后

gcc

编译,最后运行编译好的程序,整个过程都在UTF-8环境下。

理解这些误区和技巧,能让你在遇到C语言乱码时,不再只是盲目尝试,而是能有条理

以上就是VSCode怎么写C乱码_VSCode C语言编码问题解决教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/464250.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 04:48:27
下一篇 2025年11月8日 04:50:40

相关推荐

  • Uniapp 中如何不拉伸不裁剪地展示图片?

    灵活展示图片:如何不拉伸不裁剪 在界面设计中,常常需要以原尺寸展示用户上传的图片。本文将介绍一种在 uniapp 框架中实现该功能的简单方法。 对于不同尺寸的图片,可以采用以下处理方式: 极端宽高比:撑满屏幕宽度或高度,再等比缩放居中。非极端宽高比:居中显示,若能撑满则撑满。 然而,如果需要不拉伸不…

    2025年12月24日
    400
  • 如何让小说网站控制台显示乱码,同时网页内容正常显示?

    如何在不影响用户界面的情况下实现控制台乱码? 当在小说网站上下载小说时,大家可能会遇到一个问题:网站上的文本在网页内正常显示,但是在控制台中却是乱码。如何实现此类操作,从而在不影响用户界面(UI)的情况下保持控制台乱码呢? 答案在于使用自定义字体。网站可以通过在服务器端配置自定义字体,并通过在客户端…

    2025年12月24日
    800
  • 如何在地图上轻松创建气泡信息框?

    地图上气泡信息框的巧妙生成 地图上气泡信息框是一种常用的交互功能,它简便易用,能够为用户提供额外信息。本文将探讨如何借助地图库的功能轻松创建这一功能。 利用地图库的原生功能 大多数地图库,如高德地图,都提供了现成的信息窗体和右键菜单功能。这些功能可以通过以下途径实现: 高德地图 JS API 参考文…

    2025年12月24日
    400
  • 如何使用 scroll-behavior 属性实现元素scrollLeft变化时的平滑动画?

    如何实现元素scrollleft变化时的平滑动画效果? 在许多网页应用中,滚动容器的水平滚动条(scrollleft)需要频繁使用。为了让滚动动作更加自然,你希望给scrollleft的变化添加动画效果。 解决方案:scroll-behavior 属性 要实现scrollleft变化时的平滑动画效果…

    2025年12月24日
    000
  • 如何为滚动元素添加平滑过渡,使滚动条滑动时更自然流畅?

    给滚动元素平滑过渡 如何在滚动条属性(scrollleft)发生改变时为元素添加平滑的过渡效果? 解决方案:scroll-behavior 属性 为滚动容器设置 scroll-behavior 属性可以实现平滑滚动。 html 代码: click the button to slide right!…

    2025年12月24日
    500
  • 如何选择元素个数不固定的指定类名子元素?

    灵活选择元素个数不固定的指定类名子元素 在网页布局中,有时需要选择特定类名的子元素,但这些元素的数量并不固定。例如,下面这段 html 代码中,activebar 和 item 元素的数量均不固定: *n *n 如果需要选择第一个 item元素,可以使用 css 选择器 :nth-child()。该…

    2025年12月24日
    200
  • 使用 SVG 如何实现自定义宽度、间距和半径的虚线边框?

    使用 svg 实现自定义虚线边框 如何实现一个具有自定义宽度、间距和半径的虚线边框是一个常见的前端开发问题。传统的解决方案通常涉及使用 border-image 引入切片图片,但是这种方法存在引入外部资源、性能低下的缺点。 为了避免上述问题,可以使用 svg(可缩放矢量图形)来创建纯代码实现。一种方…

    2025年12月24日
    100
  • 旋转长方形后,如何计算其相对于画布左上角的轴距?

    绘制长方形并旋转,计算旋转后轴距 在拥有 1920×1080 画布中,放置一个宽高为 200×20 的长方形,其坐标位于 (100, 100)。当以任意角度旋转长方形时,如何计算它相对于画布左上角的 x、y 轴距? 以下代码提供了一个计算旋转后长方形轴距的解决方案: const x = 200;co…

    2025年12月24日
    000
  • 旋转长方形后,如何计算它与画布左上角的xy轴距?

    旋转后长方形在画布上的xy轴距计算 在画布中添加一个长方形,并将其旋转任意角度,如何计算旋转后的长方形与画布左上角之间的xy轴距? 问题分解: 要计算旋转后长方形的xy轴距,需要考虑旋转对长方形宽高和位置的影响。首先,旋转会改变长方形的长和宽,其次,旋转会改变长方形的中心点位置。 求解方法: 计算旋…

    2025年12月24日
    000
  • 旋转长方形后如何计算其在画布上的轴距?

    旋转长方形后计算轴距 假设长方形的宽、高分别为 200 和 20,初始坐标为 (100, 100),我们将它旋转一个任意角度。根据旋转矩阵公式,旋转后的新坐标 (x’, y’) 可以通过以下公式计算: x’ = x * cos(θ) – y * sin(θ)y’ = x * …

    2025年12月24日
    000
  • 如何让“元素跟随文本高度,而不是撑高父容器?

    如何让 元素跟随文本高度,而不是撑高父容器 在页面布局中,经常遇到父容器高度被子元素撑开的问题。在图例所示的案例中,父容器被较高的图片撑开,而文本的高度没有被考虑。本问答将提供纯css解决方案,让图片跟随文本高度,确保父容器的高度不会被图片影响。 解决方法 为了解决这个问题,需要将图片从文档流中脱离…

    2025年12月24日
    000
  • 如何计算旋转后长方形在画布上的轴距?

    旋转后长方形与画布轴距计算 在给定的画布中,有一个长方形,在随机旋转一定角度后,如何计算其在画布上的轴距,即距离左上角的距离? 以下提供一种计算长方形相对于画布左上角的新轴距的方法: const x = 200; // 初始 x 坐标const y = 90; // 初始 y 坐标const w =…

    2025年12月24日
    200
  • CSS元素设置em和transition后,为何载入页面无放大效果?

    css元素设置em和transition后,为何载入无放大效果 很多开发者在设置了em和transition后,却发现元素载入页面时无放大效果。本文将解答这一问题。 原问题:在视频演示中,将元素设置如下,载入页面会有放大效果。然而,在个人尝试中,并未出现该效果。这是由于macos和windows系统…

    2025年12月24日
    200
  • 为什么 CSS mask 属性未请求指定图片?

    解决 css mask 属性未请求图片的问题 在使用 css mask 属性时,指定了图片地址,但网络面板显示未请求获取该图片,这可能是由于浏览器兼容性问题造成的。 问题 如下代码所示: 立即学习“前端免费学习笔记(深入)”; icon [data-icon=”cloud”] { –icon-cl…

    2025年12月24日
    200
  • 如何利用 CSS 选中激活标签并影响相邻元素的样式?

    如何利用 css 选中激活标签并影响相邻元素? 为了实现激活标签影响相邻元素的样式需求,可以通过 :has 选择器来实现。以下是如何具体操作: 对于激活标签相邻后的元素,可以在 css 中使用以下代码进行设置: li:has(+li.active) { border-radius: 0 0 10px…

    2025年12月24日
    100
  • 如何模拟Windows 10 设置界面中的鼠标悬浮放大效果?

    win10设置界面的鼠标移动显示周边的样式(探照灯效果)的实现方式 在windows设置界面的鼠标悬浮效果中,光标周围会显示一个放大区域。在前端开发中,可以通过多种方式实现类似的效果。 使用css 使用css的transform和box-shadow属性。通过将transform: scale(1.…

    2025年12月24日
    200
  • 如何用HTML/JS实现Windows 10设置界面鼠标移动探照灯效果?

    Win10设置界面中的鼠标移动探照灯效果实现指南 想要在前端开发中实现类似于Windows 10设置界面的鼠标移动探照灯效果,有两种解决方案:CSS 和 HTML/JS 组合。 CSS 实现 不幸的是,仅使用CSS无法完全实现该效果。 立即学习“前端免费学习笔记(深入)”; HTML/JS 实现 要…

    2025年12月24日
    000
  • 如何计算旋转后的长方形在画布上的 XY 轴距?

    旋转长方形后计算其画布xy轴距 在创建的画布上添加了一个长方形,并提供其宽、高和初始坐标。为了视觉化旋转效果,还提供了一些旋转特定角度后的图片。 问题是如何计算任意角度旋转后,这个长方形的xy轴距。这涉及到使用三角学来计算旋转后的坐标。 以下是一个 javascript 代码示例,用于计算旋转后长方…

    2025年12月24日
    000
  • 为什么我的 Safari 自定义样式表在百度页面上失效了?

    为什么在 Safari 中自定义样式表未能正常工作? 在 Safari 的偏好设置中设置自定义样式表后,您对其进行测试却发现效果不同。在您自己的网页中,样式有效,而在百度页面中却失效。 造成这种情况的原因是,第一个访问的项目使用了文件协议,可以访问本地目录中的图片文件。而第二个访问的百度使用了 ht…

    2025年12月24日
    000
  • 如何用前端实现 Windows 10 设置界面的鼠标移动探照灯效果?

    如何在前端实现 Windows 10 设置界面中的鼠标移动探照灯效果 想要在前端开发中实现 Windows 10 设置界面中类似的鼠标移动探照灯效果,可以通过以下途径: CSS 解决方案 DEMO 1: Windows 10 网格悬停效果:https://codepen.io/tr4553r7/pe…

    2025年12月24日
    000

发表回复

登录后才能评论
关注微信