<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Cjk on Tarragon</title><link>https://tarrragon.github.io/blog/tags/cjk/</link><description>Recent content in Cjk on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Wed, 08 Jul 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/cjk/index.xml" rel="self" type="application/rss+xml"/><item><title>Terminal CJK Input（終端 CJK 雙寬字與即時輸入）</title><link>https://tarrragon.github.io/blog/linux/dotfile/knowledge-cards/terminal-cjk-input/</link><pubDate>Wed, 08 Jul 2026 00:00:00 +0800</pubDate><guid>https://tarrragon.github.io/blog/linux/dotfile/knowledge-cards/terminal-cjk-input/</guid><description>&lt;p>終端把 CJK 字元當雙寬字元處理：一個中文字佔兩個字元格（column），而 ASCII 是一格。這個「一個字兩格」的前提牽出兩類獨立的問題——&lt;strong>顯示&lt;/strong>（哪一層算錯寬度就錯位）與&lt;strong>輸入&lt;/strong>（終端的 raw 模式常擋掉輸入法的即時組字，但貼上不受影響）。把這兩類分開，才能判斷「打不出中文」到底卡在哪一層。顯示層最常見的錯位來源是 &lt;a href="https://tarrragon.github.io/blog/linux/dotfile/knowledge-cards/mosh-local-echo-prediction/" data-link-title="Mosh Local Echo Prediction（本地回顯預測）" data-link-desc="高延遲下 mosh 打字為何即時、它跟中文（雙寬字）顯示為何衝突、以及怎麼確認 client 真的走 mosh 而非退回 SSH 時回來讀">mosh 本地回顯預測&lt;/a> 撞上雙寬字算錯游標位置。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>機制與 &lt;code>--predict=never&lt;/code> 的關法見 &lt;a href="https://tarrragon.github.io/blog/linux/dotfile/knowledge-cards/mosh-local-echo-prediction/" data-link-title="Mosh Local Echo Prediction（本地回顯預測）" data-link-desc="高延遲下 mosh 打字為何即時、它跟中文（雙寬字）顯示為何衝突、以及怎麼確認 client 真的走 mosh 而非退回 SSH 時回來讀">mosh 本地回顯預測&lt;/a>。&lt;/p>
&lt;h2 id="雙寬字一個字兩格">雙寬字：一個字兩格&lt;/h2>
&lt;p>終端是一個固定欄寬的格子畫布，游標位置、換行、重繪都以「第幾格」計算。CJK 字元佔兩格，任何要定位游標或重畫某一行的邏輯都得正確地把中文算成寬度 2。多數終端與 server 端的 shell（bash / zsh）處理雙寬字是正確的，問題出在中間有「猜寬度」的層時。&lt;/p>
&lt;h2 id="顯示哪一層算錯寬度就錯位">顯示：哪一層算錯寬度就錯位&lt;/h2>
&lt;p>伺服器端把中文印出來通常沒問題（shell 知道寬度）。會錯位的是加了預測的連線層——mosh 的本地回顯預測要在客戶端先猜你打的字怎麼佔位，撞上雙寬字容易算錯、游標與行重繪錯位。典型症狀是&lt;strong>輸出正常、只有正在編輯的輸入行亂&lt;/strong>（輸出不經預測、輸入行才有）。&lt;/p>
&lt;h2 id="輸入raw-模式擋-ime-組字貼上繞過">輸入：raw 模式擋 IME 組字、貼上繞過&lt;/h2>
&lt;p>CJK 即時輸入需要輸入法（IME）走「組字 → 選候選字 → 上屏」的多步驟流程，而終端為了把每個按鍵即時送到遠端、常以 raw 模式接收輸入、擋掉了 IME 的組字介面。結果是：在終端裡輸入法切不到中文 / 打不出來，但這跟編碼無關——把在別處組好的中文&lt;strong>貼&lt;/strong>進終端能正常送出。所以判別點是「貼得進、打不出」：貼上繞過了即時組字流程、證明編碼與傳輸都 OK、卡的純粹是終端的即時組字支援。&lt;/p>
&lt;h2 id="判讀訊號--邊界">判讀訊號 / 邊界&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>貼上能送、即時打不出&lt;/strong> → 是終端的 IME 即時組字支援問題、不是編碼、不是鍵盤沒中文。繞法：他處組字後貼上、或用 ASCII。&lt;/li>
&lt;li>&lt;strong>即時打得出但畫面錯位&lt;/strong> → 是顯示層（多半是 mosh 預測撞雙寬字）→ 關預測或改用純 SSH。&lt;/li>
&lt;li>client 對 CJK 即時輸入的支援差異很大（有些終端 app 有實驗性 CJK 開關、有些完全不支援），要各自實測；這是行動終端的普遍弱點、不是單一 client 的 bug。&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>終端把 CJK 字元當雙寬字元處理：一個中文字佔兩個字元格（column），而 ASCII 是一格。這個「一個字兩格」的前提牽出兩類獨立的問題——<strong>顯示</strong>（哪一層算錯寬度就錯位）與<strong>輸入</strong>（終端的 raw 模式常擋掉輸入法的即時組字，但貼上不受影響）。把這兩類分開，才能判斷「打不出中文」到底卡在哪一層。顯示層最常見的錯位來源是 <a href="/blog/linux/dotfile/knowledge-cards/mosh-local-echo-prediction/" data-link-title="Mosh Local Echo Prediction（本地回顯預測）" data-link-desc="高延遲下 mosh 打字為何即時、它跟中文（雙寬字）顯示為何衝突、以及怎麼確認 client 真的走 mosh 而非退回 SSH 時回來讀">mosh 本地回顯預測</a> 撞上雙寬字算錯游標位置。</p>
<h2 id="概念位置">概念位置</h2>
<p>機制與 <code>--predict=never</code> 的關法見 <a href="/blog/linux/dotfile/knowledge-cards/mosh-local-echo-prediction/" data-link-title="Mosh Local Echo Prediction（本地回顯預測）" data-link-desc="高延遲下 mosh 打字為何即時、它跟中文（雙寬字）顯示為何衝突、以及怎麼確認 client 真的走 mosh 而非退回 SSH 時回來讀">mosh 本地回顯預測</a>。</p>
<h2 id="雙寬字一個字兩格">雙寬字：一個字兩格</h2>
<p>終端是一個固定欄寬的格子畫布，游標位置、換行、重繪都以「第幾格」計算。CJK 字元佔兩格，任何要定位游標或重畫某一行的邏輯都得正確地把中文算成寬度 2。多數終端與 server 端的 shell（bash / zsh）處理雙寬字是正確的，問題出在中間有「猜寬度」的層時。</p>
<h2 id="顯示哪一層算錯寬度就錯位">顯示：哪一層算錯寬度就錯位</h2>
<p>伺服器端把中文印出來通常沒問題（shell 知道寬度）。會錯位的是加了預測的連線層——mosh 的本地回顯預測要在客戶端先猜你打的字怎麼佔位，撞上雙寬字容易算錯、游標與行重繪錯位。典型症狀是<strong>輸出正常、只有正在編輯的輸入行亂</strong>（輸出不經預測、輸入行才有）。</p>
<h2 id="輸入raw-模式擋-ime-組字貼上繞過">輸入：raw 模式擋 IME 組字、貼上繞過</h2>
<p>CJK 即時輸入需要輸入法（IME）走「組字 → 選候選字 → 上屏」的多步驟流程，而終端為了把每個按鍵即時送到遠端、常以 raw 模式接收輸入、擋掉了 IME 的組字介面。結果是：在終端裡輸入法切不到中文 / 打不出來，但這跟編碼無關——把在別處組好的中文<strong>貼</strong>進終端能正常送出。所以判別點是「貼得進、打不出」：貼上繞過了即時組字流程、證明編碼與傳輸都 OK、卡的純粹是終端的即時組字支援。</p>
<h2 id="判讀訊號--邊界">判讀訊號 / 邊界</h2>
<ul>
<li><strong>貼上能送、即時打不出</strong> → 是終端的 IME 即時組字支援問題、不是編碼、不是鍵盤沒中文。繞法：他處組字後貼上、或用 ASCII。</li>
<li><strong>即時打得出但畫面錯位</strong> → 是顯示層（多半是 mosh 預測撞雙寬字）→ 關預測或改用純 SSH。</li>
<li>client 對 CJK 即時輸入的支援差異很大（有些終端 app 有實驗性 CJK 開關、有些完全不支援），要各自實測；這是行動終端的普遍弱點、不是單一 client 的 bug。</li>
</ul>
]]></content:encoded></item></channel></rss>