為什么 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.pswp.cn/diannao/83136.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83136.shtml
英文地址,請注明出處:http://en.pswp.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…