2017-10-10 都市傳說: "部分"中文出現亂碼

来源:https://www.cnblogs.com/program-in-chinese/archive/2019/03/04/partial_encoding_issue_for_Chinese_text.html
-Advertisement-
Play Games

"知乎原鏈, 作者亦本人" 事情起源於項目另一開發者在中文Windows下構建時遇到的 "部分中文出現亂碼問題" . 當時很不解的是, 為什麼會只有部分出現亂碼. 第一感覺是, 如果編碼轉換不正確, 要麼全亂碼, 要麼全正確. 為何會"部分"出現亂碼. 初步分析 "在此" . 簡單說, 就是在轉碼過 ...


知乎原鏈, 作者亦本人

事情起源於項目另一開發者在中文Windows下構建時遇到的部分中文出現亂碼問題.

當時很不解的是, 為什麼會只有部分出現亂碼. 第一感覺是, 如果編碼轉換不正確, 要麼全亂碼, 要麼全正確. 為何會"部分"出現亂碼.

初步分析在此. 簡單說, 就是在轉碼過程中, Java會把某些它不認識的部分直接用某個值代替. 至於為何不預設保留原數據, 是個好的考古研究課題.

示例如下(除了"開始檢", 其他都亂碼了):

編碼 原字1 原字2 原字3 原字4 原字5 原字6
原字
UTF8表示 e5 bc 80 e5 a7 8b e6 a3 80 e6 9f a5 e2 80 a6 e2 80 a6
轉為GBK後 e5 bc 3f e5 a7 8b e6 a3 80 e6 9f a5 e2 3f a6 e2 3f 3f
轉回UTF8 �? �?� �??

網上很多資源提到字元數是奇數會有問題, 這是沒錯. 但實際上即使偶數也可能會有問題. 上面的轉換過程中, 80不是合法GBK字元, 就被替換成3f. 而替換過後再轉回UTF8當然就掛了.

這個問題里的插件就是把輸出字元串指定編碼成了UTF8格式的數據, 但輸出/解碼時又用了系統預設的編碼格式(GBK). 詳見 GBK<->UTF8 互轉問題: Maven checkstyle輸出亂碼 · Issue #26 · program-in-chinese/overview, zh-cn ,,,, cmd gbk encode · Issue #3569 · checkstyle/checkstyle.

個人覺得這種轉碼問題是除了亞洲/非洲之外的開發者很容易忽視的. UTF8的字元除了亞洲(包括中日韓)和非洲語言的字元用三位元組數據表示外, 其他多數語言的字元都是用單位元組或雙位元組. 來源). 這些UTF8中三位元組的字元和GBK之類的雙位元組碼轉碼時會更容易出問題.

在調查過程中, 還發現了其他一些類似疑問, 比如UTF-8編碼,部分中文正常,部分為亂碼的問題?-CSDN論壇.

直覺是也是類似問題, 但想用編碼互轉的方式重現未果, 參考上面的例子試了幾種2次轉碼, 都沒有重現. JDBC連接MySQL拋出異常信息亂碼 - insist的專欄 - CSDN博客提到了CP1252編碼, 又經過幾次嘗試, 才試出了這個過程: "utf-8"->"windows-1252"->"iso-8859-1"->"utf-8".

階段總結一下, 亂碼問題的緣由都是編碼互轉. 全部亂碼, 部分亂碼都可能. 隨著國外代碼庫/軟體的編碼方式更多地使用UTF8, 類似第二個問題的可能會變少, 但類似第一個的UTF8<->GBK互轉的問題也許會存在很長一段時間.


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • align-content 和 align-items : 1:共同點:它們對齊方向為交叉軸 2:不同點:align-content 應用於為 多行 而 align-items:應用於單行。 單行對齊例子: 多行對齊例子 ...
  • js中有三個改變this指針的方法,分別是 apply,call,bind。很多人只知道能改變的this,但是具體的適用場景不是太清楚。我也是遇到坑後不斷的實踐發現了區別。 call ,apply方法: 在Food類中,因為使用了call改變類Product的類的this執向。所以這個時候在Prod ...
  • 高可用 負載均衡(負載均衡演算法) 反向代理 服務隔離 服務限流 服務降級(自動優雅降級) 失效轉移 超時重試(代理超時、容器超時、前端超時、中間件超時、資料庫超時、NoSql超時) 回滾機制(上線回滾、資料庫版本回滾、事務回滾) 高併發 應用緩存 HTTP緩存 多級緩存 分散式緩存 連接池 非同步併發 ...
  • 在上一篇的-負載均衡Robbin中,我們簡單講解到負債均衡的演算法和策略。負載均衡就是分發請求流量到不同的伺服器,以減小伺服器的壓力和訪問效率,但是當負載均衡的某個伺服器或是服務掛掉之後,那麼程式會出現問題麽?接下來Hystrix將會講解 1.1.簡介 Hystix,即熔斷器。 主頁:https:// ...
  • 前幾天刷朋友圈的時候,看到一段話: 如果現在我是傻逼,那麼我現在不管怎麼努力,也還是傻逼,因為我現在的傻逼是由以前決定的,現在努力,是為了讓以後的自己不再傻逼 。話糙理不糙,如果妄想現在努力一下,馬上就不再傻逼,那是不可能的,需要積累,需要沉澱,才能慢慢的不再傻逼。 好了,雞湯喝完。 今天我們的內容 ...
  • 定義:在基類中定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。 可以理解為將不變的行為放在父類中,會發生變化的行為在子類中實現,這樣可以避免子類中出現大量重覆的代碼。也就是說當子類中的方法混合了不變和可變的行為,我們通過模 ...
  • 1. 第二款抓包工具Charles安裝與使用 Charles和Fiddler一樣,也是一款抓包工具,比Fiddler界面更加清晰,支持多平臺 1.1 官方網址 https://www.charlesproxy.com/ 1.2 下載地址 Charles工具下載地址:https://www.charl ...
  • 概論: '/*'註釋內容的開始,'*/'註釋內容的結束 預處理指令 # include "studio.h" “studio.h”文件定義了很多輸入輸出功能 *.h 頭文件 *.c c源程式文件 main 函數 void mian() void代表函數不需要返回值,不需要將結果遞交給上一級程式 每個 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...