【計算機 UTF-8 轉換為本地編碼的含義】

UTF-8 轉換為本地編碼的含義

詳細解釋一下"UTF-8轉換為本地編碼"的含義以及為什么在處理中文時這很重要。

基本概念

UTF-8 編碼

  • 國際標準:UTF-8 是一種能夠表示世界上幾乎所有字符的 Unicode 編碼方式
  • 跨平臺兼容:無論在哪里,UTF-8 編碼的"中文"都是相同的字節序列
  • Web 標準:JWT、JSON 和大多數網絡協議都使用 UTF-8 作為默認編碼

本地編碼 (Locale Encoding)

  • 系統相關:不同操作系統和地區設置使用不同的本地編碼
  • 中文環境常見編碼
    • Windows 簡體中文:GBK 或 GB2312
    • 舊版 Windows:CP936
    • Linux/Unix 環境:通常是 UTF-8,但也可能是 GBK
  • 歷史遺留:許多傳統應用程序和系統API使用本地編碼

為什么需要轉換?

當您的代碼從 JWT 中獲取 UTF-8 編碼的中文字符,但您的應用程序或顯示環境使用的是本地編碼時,就會出現亂碼。

實際場景示例:

  1. JWT Payload{"name": "張三"} (UTF-8 編碼)
  2. 您的程序解碼:正確獲取了 UTF-8 字節數據
  3. Windows 控制臺顯示:控制臺默認使用 GBK 編碼,UTF-8 字節被錯誤解釋,顯示為亂碼

在代碼中的體現

在之前的解決方案中,我提供了編碼轉換函數:

// UTF-8 轉換為本地編碼
std::string CPMCADLoginHelper::utf8ToLocale(const std::string& utf8Str) {#ifdef _WIN32// Windows 下的轉換: UTF-8 → 寬字符 → GBK#else// Linux/macOS 下的轉換: 通常不需要轉換#endif
}// 本地編碼轉換為 UTF-8
std::string CPMCADLoginHelper::localeToUtf8(const std::string& localeStr) {#ifdef _WIN32// Windows 下的轉換: GBK → 寬字符 → UTF-8#else// Linux/macOS 下的轉換: 通常不需要轉換#endif
}

何時需要轉換?

場景是否需要轉換說明
從 JWT 獲取數據并在控制臺顯示需要控制臺可能使用本地編碼
從 JWT 獲取數據并在現代GUI顯示不需要Qt等現代GUI框架通常直接支持UTF-8
在Linux/macOS終端顯示通常不需要這些系統終端通常默認使用UTF-8
在Windows命令行顯示需要Windows命令行默認使用本地編碼

推薦做法

1. 統一使用 UTF-8(推薦)

在整個應用程序中統一使用 UTF-8 編碼,避免轉換:

// 在Windows上設置控制臺使用UTF-8
#ifdef _WIN32
#include <windows.h>
SetConsoleOutputCP(CP_UTF8); // 設置控制臺輸出使用UTF-8
#endif// 直接使用UTF-8字符串,不進行轉換
payloadOut = std::string(reinterpret_cast<char*>(decoded), size);

2. 按需轉換(兼容舊系統)

如果無法統一編碼,則在接口處進行轉換:

// 從JWT獲取數據(UTF-8) → 轉換為本地編碼用于顯示
std::string utf8Payload = std::string(reinterpret_cast<char*>(decoded), size);
std::string localPayload = utf8ToLocale(utf8Payload);// 用戶輸入(本地編碼) → 轉換為UTF-8用于存儲或傳輸
std::string userInput = "用戶輸入的內容";
std::string utf8ForJWT = localeToUtf8(userInput);

簡單判斷是否需要轉換的方法

您可以在程序中添加調試代碼來判斷是否需要轉換:

// 測試代碼:檢查當前環境的編碼支持
void testEncoding() {std::string testChinese = "\u4E2D\u6587\u6D4B\u8BD5"; // "中文測試"的Unicode轉義序列std::cout << "直接輸出UTF-8中文: " << testChinese << std::endl;#ifdef _WIN32// 嘗試設置控制臺為UTF-8模式SetConsoleOutputCP(CP_UTF8);std::cout << "設置UTF-8模式后: " << testChinese << std::endl;#endif
}

如果第一個輸出是亂碼而第二個輸出正確,說明您需要轉換編碼或設置環境使用UTF-8。

總結

  • UTF-8轉本地編碼:是為了在不支持UTF-8的環境中正確顯示中文
  • 最佳實踐:盡量統一使用UTF-8編碼,避免轉換帶來的復雜性和性能開銷
  • Windows特別注意:Windows命令行默認不使用UTF-8,需要額外設置

在您的JWT解碼場景中,如果亂碼問題仍然存在,建議先嘗試統一使用UTF-8,如果不行再使用編碼轉換函數。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96580.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96580.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96580.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

4.6 變體

1.變體簡介 2.為什么需要變體 3.變體是如何產生的 4.變體帶來的麻煩 5.multi_compile和shader_feature1.變體簡介 比如我們開了一家餐廳, 你有一本萬能的菜單(Shader源代碼), 上面包含了所有可能的菜式; 但是顧客每次來點餐時, 不可能將整本菜單都做一遍, 他們會根據今天有沒有…

猿輔導Android開發面試題及參考答案(下)

為什么開發中要使用線程池,而不是直接創建線程(如控制線程數量、復用線程、降低開銷)? 開發中優先使用線程池而非直接創建線程,核心原因是線程池能優化線程管理、降低資源消耗、提高系統穩定性,而直接創建線程存在難以解決的缺陷,具體如下: 控制線程數量,避免資源耗盡…

【網絡通信】IP 地址深度解析:從技術原理到企業級應用?

IP 地址深度解析&#xff1a;從技術原理到企業級應用? 文章目錄IP 地址深度解析&#xff1a;從技術原理到企業級應用?前言一、基礎認知&#xff1a;IP 地址的技術定位與核心特性?1.1 定義與網絡層角色1.2 核心屬性與表示法深化二、地址分類&#xff1a;從類別劃分到無類別路…

grafana實踐

一、如何找到grafana的插件目錄 whereis grafana grafana: /etc/grafana /usr/share/grafana插件安裝目錄、默認安裝目錄&#xff1a; 把vertamedia-clickhouse-datasource-3.4.4.zip解壓到下面目錄&#xff0c;然后重啟就可以了 /var/lib/grafana/plugins# 6. 設置權限 sudo …

uniapp 文件查找失敗:main.js

重裝HbuilderX vue.config.js 的 配置 有問題main.js 框架能自動識別 到&#xff0c;不用多余的配置

KEIL燒錄時提示“SWD/JTAG communication failure”的解決方法

最新在使用JTAG仿真器串口下載調試程序時&#xff0c;老是下載不成功&#xff0c;識別不到芯片&#xff0c;我嘗試重啟keil5或者重新插拔仿真器連接線、甚至重啟電腦也都不行&#xff0c;每次下載程序都提示如下信息&#xff1a;在確定硬件連接沒有問題之后&#xff0c;就開始分…

紅日靶場(三)——個人筆記

環境搭建 添加一張網卡&#xff08;僅主機模式&#xff09;&#xff0c;192.168.93.0/24 網段 開啟centos&#xff0c;第一次運行&#xff0c;重啟網絡服務 service network restart192.168.43.57/24&#xff08;外網ip&#xff09; 192.168.93.100/24&#xff08;內網ip&am…

車載網關框架 --- 車內網關IP轉CAN鏈路解析 done

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

lvgl修改輸入設備驅動使其支持鼠標右鍵、雙擊、滑輪...

我在前幾章移植 lvgl 到linux上時講過注冊鼠標驅動部分&#xff0c;那時候使用的時默認提供的驅動&#xff0c;支持的鼠標功能很少&#xff0c;只有左鍵點擊&#xff0c;那時候我提過我們可以修改驅動使其支持&#xff0c;下面是具體的實現。看上面代碼&#xff0c;我們當時是直…

SpringBoot 中單獨一個類中運行main方法報錯:找不到或無法加載主類

1. 報錯SpringBoot項目&#xff0c;在隨機某個類使用main方法&#xff0c;點擊運行/調試報錯錯誤: 找不到或無法加載主類 com.central.workorder.config.PropertyEncrypt 原因: java.lang.ClassNotFoundException: com.central.workorder.config.PropertyEncrypt2. 原因縮短命令…

React 核心 Hook 與冷門技巧:useReducer、useEffect、useRef 及 is 屬性全解析

&#x1f4da; 前言React 的函數組件 Hooks 模式已經成為現代前端開發的主流。相比類組件&#xff0c;Hooks 讓狀態管理和副作用處理更加簡潔和可復用。但在實際開發中&#xff0c;除了常用的 useState 和 useEffect&#xff0c;還有很多“進階武器”值得我們掌握。本文將深入…

通義靈碼產品演示: 數據庫設計與數據分析

作者&#xff1a;了哥 演示主題&#xff1a;AI 進行數據庫設計以及做數據分析 演示目的 演示通義靈碼對于數據庫的設計能力以及數據分析能力。 演示準備 準備數據庫&#xff0c;這里為了簡單實用 sqlite3 brew install sqlite3使用 vscode&#xff0c;同時安裝好通義靈碼的插件…

MySQL主從同步參數調優案例

#作者&#xff1a;stackofumbrella 文章目錄一、前言二、故障概述2.1 基礎信息2.2 故障現象描述三、故障診斷分析3.1 排查過程3.2 問題根因四、故障解決方案 &#x1f4ca;4.1 解決方案 &#x1f6e0;?五、總結附件一、前言 在磐基系統中大量使用MySQL作為后端的數據存儲&…

【代碼隨想錄算法訓練營——Day10】棧與隊列——232.用棧實現隊列、225.用隊列實現棧、20.有效的括號、1047.刪除字符串中的所有相鄰重復項

LeetCode題目鏈接 https://leetcode.cn/problems/implement-queue-using-stacks/ https://leetcode.cn/problems/implement-stack-using-queues/description/ https://leetcode.cn/problems/valid-parentheses/description/ https://leetcode.cn/problems/remove-all-adjacent-…

Asp .Net Core 系列:Asp .Net Core 集成 Hangfire+MySQL

在 .NET 或 .NET Core 應用中&#xff0c;若需在不依賴 Windows 服務、獨立進程的前提下實現后臺處理&#xff0c;Hangfire 是最成熟、簡單的方案之一 —— 它可直接嵌入現有應用&#xff08;如 ASP.NET Core Web 應用&#xff09;&#xff0c;無需額外部署&#xff0c;同時提供…

網站漏洞掃描要怎么處理?

在網絡安全領域&#xff0c;網站漏洞是黑客攻擊的重要突破口&#xff0c;而網站漏洞掃描能及時發現這些隱患。但很多小白在完成漏洞掃描后&#xff0c;不清楚后續該如何處理&#xff0c;導致漏洞一直存在&#xff0c;給網站安全埋下風險。下面從準備工作、處理步驟、驗證維護等…

淘寶RecGPT:通過LLM增強推薦

導論背景 (Background)??推薦系統的核心挑戰??&#xff1a;怎么 準確推斷 用戶行為背后快速變化的真實意圖&#xff0c;以實現用戶、商戶和平臺的三贏。??現有方法的局限性??&#xff1a;傳統的基于歷史日志共現模式&#xff08;“從點擊學習點擊”&#xff09;的模型&…

【Go系統編程】07 網絡化IPC:Go的王牌——Socket編程

大家好&#xff0c;我是Tony Bai。歡迎來到我們《Go 系統編程》專欄的最后一講。在過去的旅程中&#xff0c;我們探索了管道、消息隊列、共享內存等一系列強大的 IPC 機制。它們各有所長&#xff0c;但都有一個共同的、致命的局限性&#xff1a;它們都只能在同一臺物理機上工作…

claude code使用小竅門

視頻地址 B站 1 /init 在項目最開始的時候&#xff0c;使用/init可以將項目通讀一遍。cc會將學習到的關于項目的知識都保存到CLAUD.MD文件中 2、 /compact 用來壓縮對話的上下文&#xff0c;claude會將之前的一些亂七八糟或者重復的對話刪除壓縮&#xff0c;有利于提高AI的…

The learning process of Decision Tree Model|決策樹模型學習過程

----------------------------------------------------------------------------------------------- 這是我在我的網站中截取的文章&#xff0c;有更多的文章歡迎來訪問我自己的博客網站rn.berlinlian.cn&#xff0c;這里還有很多有關計算機的知識&#xff0c;歡迎進行留言或…