为什么 cout<<“中文你好“ 能正常输出中文

一, 简答:

受python3字符串模型影响得出的下文C++字符串模型结论 是错的!C++的字符串和python2的字符串模型类似,也就是普通的字符串是ASCII字符串和字节串两种语义,类似重载或多态,有时候解释为整数,有时候是字节串。Unicode字符串有单独的其他类型。并不是像python3一样,普通字符串都是Unicode码点表示也就是都是整数,字节串是单独一种类型。

我们知道"你好中文"是Unicode字符串, 需要用宽字符输出对象wcout<<来输出, 但是为什么用于ASCII输出的cout<<却能正常输出中文呢? 答案: 是终端的作用! 而不是C++的作用.

 

源代码文本文件的编码方案我们一般是用utf8, 里面的字符串在文本文件中存储内部或说背后就是utf8的字节串, 编译器编译为可执行文件时会按utf8(默认)把源代码中的字符串的字节串解码为程序运行时字符串在内存中的码点序数值. 然后, 在cout<< 输出字符串时, <<运算符会把字符串的码点序列按utf8(默认)编码为字符串(码点)编码为在文本文件存储或终端窗口中打印的字节串. 终端再按utf8(linux和macos里)显示(这里的显示背后还有 字体渲染流程必然包含“字节流→码点→字形→渲染”的转换链)出来. 在Windows里终端默认是gbk编码方案, 所以会显示为乱码, 需要在前面编译程序时加-fexec-charset=gbk编译选项, 就能在终端正常显示中文了. 


字符串在编译链接生成的可执行文件内部是字符串中字符序列的码点序数值的序列, cout<<中的<<运算符把内部字符串的码点序数值序列转换为默认用utf8编码的对应字节串(字符串只是在文本文件中展示给人类看时是字符渲染出的样子, 在计算机内部, 在程序运行时内部是码点序数值, 也就是整数类型). cout<<遇到const char* 时<<运算符还会把字节(8位)串序列输出到终端, 但是为什么终端不输出为8位的字节串序列, 而是能在终端输出为 正常的中文字符, 因为 cout<<只是编码原样不改地从程序utf8码点序数指序列向终端窗口传递字符串的utf8编码的字节串(终端和文本文件是一样的), 而终端是会按utf8(ubuntu里)解码, 所以就正常输出了中文字符串. (码点序数值指字符在运行时内存中的某种编码比如utf8下的序数, 字节串指比如字符向文本文件存储时某种编码下的字节串. 这2个名词的详情解释可以看我前面一篇Python学习手册第37章Unicode和字节串解读部分一 学习记录)

如果源代码文本文件是gbk编码, 编译指令要加-finput-charset=gbk, 如果windows终端输出要加-fexe-charset=gbk. 这样会有一个gbk和编译器内部默认编码utf8之间的转换. 

需要知道 仅用于输出时才可以用const char* 的常量来指向中文字符串, 如果处理中文字符串(比如strlen获取字符数)用const char* 就不对了,  包括std::string(string是用于存储ASCII字符串, std::wstring才是用于宽字符串)存储中文字符串 用str.size()也会不对, 应该用wchar_t, char16_t, char32_t, char8_t, 或wstring, u16string, u32string, u8string, 来存储中文字符串才是正规的, 但是对于char16_t, char32_t, char8_t, C++好像并没有对应的输出方法.

总归, 用const char* 或std::string 指向或存储中文字符串, 是不好的. c++也应该学Python3一样进行改革, 把char类型默认就用utf-8字符集编码方案, 而不是现在的 ASCII.  当然这样说并没有充足的考虑, 比如后向兼容(新标准要兼容旧标准下写的代码)等考虑. 

 

二, 详细解答: 

 

我们知道在输出字符串时, cout << 是用于ASCII 字符串的. wcout<< 是用于输出wchar_t字符串的. 但是对于char16_t, char32_t, char8_t, C++好像并没有对应的输出方法.

另外要注意wchar_t在Windows和Linux/Macos是不一样的长度: Win里wchar_t是utf16字符集编码方案, Linux和Macos里wchar_t是utf32字符集编码方案. 

 

问AI C++的unicode字符串:

在C++中处理Unicode字符串主要涉及以下几种方式:

1. 字符类型与字符串类  
   • 使用`wchar_t`(宽字符)、`char16_t`(UTF-16)或`char32_t`(UTF-32)存储Unicode字符。//其中wchar_t在windows系统上是utf-16, 在linux上是utf-32.

   • 对应的字符串类为`std::wstring`、`std::u16string`和`std::u32string`。


2. 编码转换  
   • C++11提供了`std::wstring_convert`和`std::codecvt`(如`std::codecvt_utf8`)进行UTF-8与宽字符的转换。例如:

     ```cpp
     #include <codecvt>
     std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
     std::string utf8Str = converter.to_bytes(L"你好"); // 宽字符转UTF-8
     std::wstring wideStr = converter.from_bytes("Hello"); // UTF-8转宽字符
     ```

3. 输入输出  
   • 使用宽字符流(如`std::wcout`、`std::wcin`)输出Unicode字符串时,需设置正确的本地化环境:

     ```cpp
     std::wcout.imbue(std::locale("en_US.utf8"));
     std::wcout << L"你好,世界!" << std::endl;
     ```

4. 第三方库  
   • 复杂场景(如跨平台编码处理)推荐使用ICU库或Boost.Locale。


5. 注意事项  
   • `wchar_t`的大小因平台而异(Windows为16位,Linux通常为32位),建议优先使用`char16_t`/`char32_t`明确编码。

   • 文件操作时需用宽字符文件流(如`std::wifstream`)并指定编码。


第一, 在程序内部(编译时和运行时), 码点序数值是某个字符集编码方案下的! 这里的字符集编码方案就是通常说的C++编译器的字符集编码方案.


第二, 源代码文本文件的字符集编码方案, 都是用utf-8, 如果用gbk, 则要加-finput-charset=gbk, 来编译. 这行编译指令会进行编码转换,如把gbk转为utf8的码点.


关于 字符集和编码方案名词所指: utf-8, utf-16, utf-32都是一样的字符集, 包括的所有字符是一样的, 这3个是不一样的编码方案, utf16是2或4字节, utf-32是固定的所有字符都用32位(4字节), utf-8对不同的字符是不一样的尺寸来表示. 


输入编码解析​​
GCC默认假设源文件为UTF-8编码。通过-finput-charset=gbk,编译器会将文件内容按GBK编码解析,而非UTF-8。例如,GBK编码的“你好”(0xC4E3 0xBAC3)会被正确识别为两个汉字,而非UTF-8的字节序列。
​​内部转换机制​​
GCC调用系统的字符转换功能,将GBK编码的字符转换为内部使用的UTF-8格式(即使未显式指定-fexec-charset,默认输出仍为UTF-8)。若同时指定-fexec-charset=gbk,则编译器会跳过内部转换,直接输出GBK编码的二进制数据.

为什么char类型的字符串里放中文字符串而用cout<<能正确输出为中文 ??


首先, 只限于char字符串, 如果char字符, 是不能放一个中文字符的! 
第二, const char* p_str = "中文你好"; //gcc编译器是utf-8编码, "中文你好"能被编码为utf8的码点序数值, 


这里, p_str只是一个指针, 而且不会解引用, cout<< 遇到p_str输出, 关键在cout<<的<<运算符按空字符来终止输出! 


关键在cout<<的<<重载定义:
在C++中,`cout`的`operator<<`对`const char*`的重载不直接处理编码转换,其行为本质上是按字节序列输出直到遇到空字符,具体机制如下:

1. 编码无关性  
   `operator<<(ostream&, const char*)`的重载仅负责将指针指向的字节序列逐字节输出,不感知编码。若字符串是UTF-8编码(如`const char* p_str = "中文你好";`),且终端环境支持UTF-8解码(如Linux Console默认UTF-8),则能正确显示;否则输出乱码。

2. UTF-8的隐式支持  
   • 编译器会将源码中的字符串字面量(如`"中文你好"`)按源文件编码(如UTF-8)转换为二进制序列存储在可执行文件中。  

   • `cout << p_str`输出时,若终端编码与字符串编码一致(均为UTF-8),则显示正常;否则需显式转换编码(如使用`std::wstring_convert`或第三方库ICU)。


3. 宽字符重载  
   对于UTF-16/32编码的字符串,需使用`wchar_t*`和`std::wcout`,并通过`std::locale`或`std::codecvt`指定编码转换规则。例如:
   ```cpp
   std::wcout.imbue(std::locale("en_US.utf8"));
   std::wcout << L"中文你好";  // 显式宽字符UTF-16/32输出
   ```

4. 关键结论  
   • `operator<<`对`const char*`的重载不涉及UTF-8解码,仅传递字节流。  

   • 正确显示UTF-8需终端编码匹配,跨平台场景建议使用宽字符或显式编码转换。


若需直接操作UTF-8字符串(如验证、字符遍历),需依赖第三方库(如ICU)或C++20的`std::u8string`(编译器支持有限)。

char* 的能力​​
​​指向连续内存​​:char* 是一个指针,可以指向​​多字节的字符序列​​(如字符串)。中文字符串在内存中以连续字节存储(如UTF-8的 "你好" 占6字节),char* 通过地址访问整个序列。
​​终止符机制​​:cout << char* 会从指针地址开始输出字节,直到遇到空字符 \0,因此能正确输出多字节的中文字符串(前提是终端编码匹配)

cout<<遇到char*应该逐字节输出, 但是怎么会按utf8来解码输出呢?
这样一问, AI 就解决了疑问:
`cout <<` 遇到 `char*` 时,本质上是逐字节输出,但最终显示为 UTF-8 解码的字符,是由以下机制共同作用的结果:

---

1. **`cout` 对 `char*` 的处理机制**
   • 逐字节输出:`operator<<` 对 `char*` 的重载会从指针地址开始,逐个字节输出直到遇到 `\0`,不主动解析编码(如UTF-8或GBK)。

   • 编码无关性:`cout` 仅传递字节流,不负责解码。若字符串是UTF-8编码(如 `const char* p = "中文"`),输出的是原始的UTF-8字节序列(如 `0xE4B8AD 0xE69687`)。

2. **终端显示的UTF-8解码** // 这里是重点!!! 能显示正确的utf8字符串, 是终端的作用!!
   • 终端匹配编码:若终端(如Linux Console、现代IDE)默认使用UTF-8编码,它会将接收到的字节流按UTF-8规则解码,从而正确显示中文字符。

   • 乱码场景:若终端编码不匹配(如Windows默认GBK),UTF-8字节流会被错误解码,显示乱码。


3. **编译器与文件编码的作用**
   • 源码文件编码:编译器会将源码中的字符串字面量(如 `"中文"`)按文件编码(如UTF-8)转换为二进制序列。若文件保存为UTF-8,生成的二进制数据即为UTF-8字节流。

   • 无运行时转换:除非显式指定(如 `-fexec-charset=utf-8`),编译器不会在运行时主动转换编码。


4. **关键结论**
   • `cout << char*` 不涉及UTF-8解码,仅是字节流的传递者。

   • 正确显示依赖终端编码与字符串编码一致。例如:

     ```cpp
     const char* utf8_str = u8"你好";  // 显式UTF-8编码
     std::cout << utf8_str;           // 需终端支持UTF-8
     ```

---

5. **验证示例**
```cpp
#include <iostream>
#include <cstring>

int main() {
    const char* str = "中文";  // 文件保存为UTF-8
    // 输出字节流(十六进制)
    for (size_t i = 0; i < strlen(str); i++) {
        std::cout << std::hex << (int)(unsigned char)str[i] << " ";
    }
    // 输出字符串
    std::cout << "\n" << str << std::endl;
    return 0;
}
```
• 输出结果:

  • 字节流:`e4 b8 ad e6 96 87`(UTF-8编码的“中文”)

  • 字符串:若终端为UTF-8,显示“中文”;否则乱码。


6. **扩展建议**
• 跨平台兼容:使用 `std::wcout` 和宽字符(`wchar_t`)或C++20的 `std::u8string`。

• 显式编码转换:如需处理混合编码,可用 `iconv` 或 `std::codecvt`。


字符串在计算机中的表示既可以是码点序数值(Unicode码点)的序列,也可以是字符集编码下的字节串序列,具体取决于所处的上下文和处理阶段。

1. **字符串的本质:码点序列**
• Unicode码点:字符串在逻辑上是由Unicode码点(Code Point)组成的序列。每个字符对应唯一的Unicode编号(如 `'A'` 的码点是 `U+0041`,`'中'` 的码点是 `U+4E2D`)。

• 抽象表示:在内存中(如Python的`str`类型或Java的`String`),字符串通常以Unicode码点的形式存储,与具体编码无关。


2. **存储与传输:字节序列**
• 编码后的字节流:当字符串需要存储到文件或通过网络传输时,必须通过字符编码(如UTF-8、GBK)转换为字节序列。例如:

  • UTF-8将`'中'`(`U+4E2D`)编码为3字节:`0xE4 0xB8 0xAD`。

  • GBK将`'中'`编码为2字节:`0xD6 0xD0`。

• 编码与解码:

  • 编码(Encode):将码点序列转换为字节序列(如`"中文".encode("UTF-8")`)。

  • 解码(Decode):将字节序列还原为码点序列(如`b"\xE4\xB8\xAD".decode("UTF-8")`)。

 

4. **编程语言中的体现**
• Python:`str`类型是Unicode码点序列,`bytes`类型是编码后的字节序列。

• C/C++:`char*`直接操作字节序列,需手动处理编码(如UTF-8的变长编码)。

• Java:`String`内部使用UTF-16编码的码点序列,但对外表现为逻辑字符。


5. **总结**
• 字符串本质是Unicode码点序列,属于逻辑层的抽象。

• 具体存储时需转换为字节序列,依赖字符编码规则(如UTF-8的变长编码)。

• 乱码问题通常源于编码与解码时字符集不匹配(如UTF-8字节流用GBK解码)。
 

用char* 可以正常在终端输出为中文, 但如果要处理,比如strlen()获得字符个数, 就不能用char*或std::string来指向或存储中文字符串了, 而要用wchar_t或char16_t, char32_t, 或std::wstring 来存储中文字符串. 用wchar_t能wcout正常输出, 但是char16_t怎样输出呢?
在C++中,`char16_t` 是用于存储UTF-16编码的字符类型,但标准库(如`std::cout`)不直接支持其输出。以下是几种输出`char16_t`字符串的方法:

---

1. **转换为UTF-8后输出**
使用 `std::wstring_convert` 或 `std::codecvt`(C++11/C++14,但C++17后已弃用)将UTF-16转换为UTF-8,再通过`std::cout`输出:
```cpp
#include <iostream>
#include <codecvt>
#include <locale>

int main() {
    const char16_t* u16str = u"你好"; // UTF-16字符串
    std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> converter;
    std::string utf8_str = converter.to_bytes(u16str); // 转为UTF-8
    std::cout << utf8_str << std::endl; // 输出UTF-8字节流
    return 0;
}
```
注意:`std::codecvt`在C++17后被标记为弃用,建议使用第三方库(如ICU)替代。

---

2. **直接输出UTF-16编码值**
遍历`char16_t`数组,输出每个字符的十六进制值:
```cpp
#include <iostream>
#include <iomanip>

int main() {
    const char16_t u16str[] = u"你好";
    for (size_t i = 0; u16str[i] != 0; ++i) {
        std::cout << "U+" << std::hex << std::setw(4) << std::setfill('0') 
                  << static_cast<uint16_t>(u16str[i]) << " ";
    }
    return 0;
}
```
输出示例:`U+4f60 U+597d`(对应“你好”的UTF-16码点)。

---

3. **平台特定方法(Windows)**
在Windows上,`wchar_t`与`char16_t`均为16位,可直接转换后使用`std::wcout`:
```cpp
#include <iostream>
#include <locale>

int main() {
    setlocale(LC_ALL, "en_US.utf8"); // 设置本地化支持UTF-8
    const char16_t* u16str = u"你好";
    const wchar_t* wstr = reinterpret_cast<const wchar_t*>(u16str);
    std::wcout << wstr << std::endl; // 需终端支持UTF-16
    return 0;
}
```
注意:此方法依赖平台(Windows的`wchar_t`为UTF-16,Linux/macOS为UTF-32)。

---

4. **使用第三方库(推荐)**
对于跨平台场景,推荐使用ICU或Boost.Locale:
```cpp
#include <unicode/unistr.h>
#include <iostream>

int main() {
    icu::UnicodeString ustr(u"你好"); // UTF-16字符串
    std::string utf8;
    ustr.toUTF8String(utf8); // 转为UTF-8
    std::cout << utf8 << std::endl;
    return 0;
}
```

 

建议:优先使用ICU等库处理Unicode字符串,避免直接依赖弃用功能。

 

在字体渲染流程中,确实存在从文本文件存储的字节串到程序运行时解码为Unicode码点序数值的过程。以下是关键步骤分析:

  1. 字节串到码点的解码
    文本文件中的字符通常以特定编码(如UTF-8、GBK)存储为字节序列。程序运行时需先通过编码规则(如UTF-8的变长编码)将字节流解码为Unicode码点序列。例如:
    • UTF-8编码的0xE4 0xB8 0xAD → Unicode码点U+4E2D(汉字“中”)。

    • 浏览器或文本处理库(如std::codecvt)会解析HTTP头或文件元数据确定编码方式,再执行解码。

  2. 码点到字形的映射
    解码后的码点通过字体文件的cmap表(字符映射表)转换为字形索引(Glyph Index)。例如:
    • TrueType/OpenType字体中,U+4E2D可能映射到字形编号123

    • 渲染引擎(如FreeType)根据字形索引加载轮廓数据或位图。

  3. 字形渲染
    字形数据经栅格化(矢量→像素)或直接渲染,最终显示为可视字符。

总结:字体渲染流程必然包含“字节流→码点→字形→渲染”的转换链,其中解码为码点是关键前置步骤。

 

总归, 用const char* 或std::string 指向或存储中文字符串, 是不好的. c++也应该学Python3一样进行改革, 把char类型默认就用utf-8字符集编码方案, 而不是现在的 ASCII.  当然这样说并没有充足的考虑, 比如后向兼容(新标准要兼容旧标准下写的代码)等考虑. 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/83136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙的卓易通,让我踩了一次坑

前言 因为我本身对鸿蒙提不起兴趣&#xff0c;哪怕有些文章给鸿蒙穿上了“黑丝”&#xff0c;再加上公司当前没有适配鸿蒙的计划&#xff0c;所以关于鸿蒙的消息我都关注的很少。 今早&#xff0c;看到了徐宜生老师的一篇文章&#xff1a;“鸿蒙卓易通&#xff0c;是饮鸩止渴…

Cursor vs VS Code vs Zed

代码编辑器的世界已经迎来了创新的爆发。曾经由重量级IDE或基础文本编辑器主导的领域,如今开发者们发现自己正在探索全新一波聚焦于AI集成、协作和性能的工具。 在本文中,我们将深入探讨2025年三款流行的编辑器:Cursor、Visual Studio Code (VS Code)和Zed Code Editor。每…

使用 LiteFlow 实现灵活的业务逻辑解耦

1. 引言 1.1 业务逻辑复杂性带来的挑战 在现代软件开发中,随着业务需求不断增长,代码结构日趋复杂。硬编码式的流程控制方式难以适应频繁变更的需求,导致维护成本高、可读性差、扩展性弱。 1.2 规则引擎在解耦中的作用 规则引擎(Rule Engine)通过将业务逻辑与程序代码…

以项目的方式学QT开发(一)——超详细讲解(120000多字详细讲解,涵盖qt大量知识)逐步更新!

以项目的方式学QT开发 以项目的方式学QT开发 P1 QT介绍 1.1 QT简介 1.2 QT安装 1.2.1 Windows QT安装 1.2.2 QT Creator 使用基本介绍 P2 C基础 2.1 命名空间 2.1.1 命名空间作用 2.1.2 自定义命名空间 2.2 从C语言快速入门 2.2.1 输入输出 2.2.2 基…

【前端】【css】【总复习】三万字详解CSS 知识体系

&#x1f308; CSS 知识体系目录大纲 一、基础知识入门 1. CSS 简介与作用 CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式表&#xff09;是一种用于给 HTML 页面添加样式的语言&#xff0c;作用是让网页更美观、结构更清晰、布局更灵活。 核心作用&#xff1a;…

R利用spaa包计算植物/微生物的生态位宽度和重叠指数

一、生态位宽度 生态位宽度指数包括shannon生态位指数和levins生态位指数。下面是采用levins方法计算生态位宽度。method也可以选择“shannon”。 二、生态位重叠指数 生态位重叠指数&#xff0c;包括levins生态位重叠指数、schoener生态位重叠指数、petrai…

【论信息系统项目的合同管理】

论信息系统项目的合同管理 论文要求写作要点正文前言一、合同的签订管理二、合同履行管理三、合同变更管理四、合同档案管理五、合同违约索赔管理结语 论文要求 项目合同管理通过对项目合同的全生命周期进行管理&#xff0c;来回避和减轻可识别的项目风险。 请以“论信息系统项…

最新网盘资源搜索系统,电视直播,Alist聚合播放

源码描述&#xff1a; 本项目是基于Vue与Nuxt.js技术构建的网盘搜索项目&#xff0c;持续开源并维护更新。该项目旨在使每个人都能拥有属于自己的网盘搜索网站。我们强烈建议用户自行部署该项目。 更新日志&#xff1a; 新增TV播放功能新增Alist源聚合播放功能新增批量删除功…

【Ubuntu】安装BitComet种子下载器

环境 Ubuntu 24.04.2 下载依赖库 环境比较新&#xff0c;此软件需要依赖很多旧的库&#xff0c;逐个安装下载&#xff1a; 1.libicu70 http://nz.archive.ubuntu.com/ubuntu/pool/main/i/icu/libicu70_70.1-2_amd64.deb2.libjavascriptcoregtk-4.0-18 http://security.ubu…

修复“ImportError: DLL load failed while importing lib: 找不到指定的程序”笔记

#工作记录 一、问题描述 在运行CosyVoice_For_Windows项目时&#xff0c;出现以下报错&#xff1a; Traceback (most recent call last): File "D:\ProgramData\anaconda3\envs\CosyVoice\Lib\pydoc.py", line 457, in safeimport module __import__(path) …

ubuntu18 设置静态ip

百度 编辑/etc/netplan/01-netcfg.yaml 系统没有就自己编写 network: version: 2 renderer: networkd ethernets: eth0: dhcp4: no addresses: [192.168.20.8/24] # 设置你的IP地址和子网掩码 gateway4: 192.168.20.1 # 网关地址 namese…

帧差法识别

定义&#xff1a; 视频通过闪过x帧画面来实现&#xff0c;帧差法就是利用两帧之间的差异找出。也就是移动目标识别 帧差法识别步骤&#xff1a; 1、灰度处理&#xff1a;将多通道变成双通道压缩图像数据。 cvtColor(before_frame,before_gray,CV_RGB2GRAY);cvtColor(after_f…

基于OAuth2+SpringSecurity+Jwt实现身份认证和权限管理后端服务

1、简介 本文讲述了如何实现简易的后端鉴权服务。所谓“鉴权”&#xff0c;就是“身份鉴定”“权限判断”。涉及的技术有&#xff1a;OAuth2、SpringSecurity、Jwt、过滤器、拦截器。OAuth2用于授权&#xff0c;使用Jwt签发Access Token和Refresh Token&#xff0c;并管理token…

<C++> MFC自动关闭对话框(MessageBoxTimeout)

MFC自动关闭对话框&#xff08;MessageBoxTimeout&#xff09; 记录一下今天在界面开发中的解决方案。自动关闭对话框有两种方案&#xff1a; 1.使用定时器实现延迟关闭&#xff08;DeepSeek方案&#xff09; 提示框显示几秒后自动关闭&#xff0c;可以使用 SetTimer KillT…

多语言支持的常见设计方案

在 Java 项目中实现**多语言&#xff08;国际化&#xff0c;i18n&#xff09;**功能&#xff0c;是很多企业级应用支持不同地区和语言用户的基础需求。以下是 Java 中实现多语言支持的常见设计方案&#xff1a; 一、常见多语言设计方案 1. 使用 ResourceBundle 读取 propertie…

vuex基本介绍

Vuex是Vue.js应用程序中专门用于状态管理的库。以下是其基本介绍&#xff1a; 概念 Vuex采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 特点 - 集中化管理&#xff1a;将应用的状态集中存储在一个单一的状态…

Android开发-在应用之间共享数据

在Android系统中&#xff0c;应用之间的隔离机制&#xff08;沙箱机制&#xff09;保障了系统的安全性与稳定性。然而&#xff0c;在实际开发中&#xff0c;我们经常需要实现跨应用的数据共享&#xff0c;例如&#xff1a; 从一个应用向另一个应用传递用户信息&#xff1b;多个…

深度解析 JWT:从原理到实战的全场景解决方案(附永久 Token 设计与集成系统实践)

摘要 本文结合 JWT 官方标准&#xff08;RFC 7519&#xff09;与生产级实践&#xff0c;全面解析 JSON Web Token 的核心机制、安全规范及 Java 生态最佳实现。涵盖 JJWT 工具类优化、Auth0/Nimbus 替代方案对比、永久 Token 设计&#xff08;满足集成系统长期调用需求&#x…

[特殊字符]Meilisearch:AI驱动的现代搜索引擎

前言 大家好&#xff0c;我是MAI麦造&#xff01; 上文介绍一了Manticore Search 这款轻量级的搜索引擎&#xff0c;这次又有了新的发现&#xff01;传送门&#xff1a; Elasticsearch太重&#xff1f;它的超轻量的替代品找到了&#xff01; 这是一个让我超级兴奋的AI搜索引…

【Linux C/C++开发】轻量级关系型数据库SQLite开发(包含性能测试代码)

前言 之前的文件分享过基于内存的STL缓存、环形缓冲区&#xff0c;以及基于文件的队列缓存mqueue、hash存储、向量库annoy存储&#xff0c;这两种属于比较原始且高效的方式。 那么&#xff0c;有没有高级且高效的方式呢。有的&#xff0c;从数据角度上看&#xff0c;&#xff0…