通过 Windows RDP 连接 Ubuntu XRDP 时,让日文 Mac 键盘正确工作

远程键盘问题最容易让人困惑的地方在于,它们看起来往往像是某一个单独的设置出了问题,但实际上通常是一整条链路。

就我的情况而言,真正的路径是:

  • 日文 Mac 键盘
  • 通过远程控制应用连接到一台 Windows 机器
  • 再通过 Windows App / RDP 连接到 Ubuntu
  • Ubuntu 上运行 xrdp
  • XRDP 会话中的一个 X11 桌面

Windows 端的日文输入已经可以正常使用。Ubuntu 上的 Terminal 和 Sublime Text 也都能接受日文和中文输入。但 Ubuntu 的 XRDP 桌面在那些依赖物理键位的位置上,仍然表现得像一把普通的 us / pc105 键盘。

真正的修复方式不是全局修改整台 Ubuntu 机器,而是只让 XRDP 会话使用最接近的内置 Apple 日文键盘配置。

第一步:接受 Windows 能做什么、不能做什么

Windows 没有 macOS 那种“这把物理键盘是日文 Mac 键盘”的设置项。

在 Windows 这边,实际可行的做法是:

  • 在 Windows 语言设置中添加日语。
  • 使用日文键盘 / Microsoft IME。
  • 如果 Windows 总是切回去,就移除或降低 US 的优先级。
  • 如果错误的输入法反复出现,就使用高级键盘设置。

Windows 端有用的命令:

Start-Process 'ms-settings:regionlanguage'
Start-Process 'control.exe' -ArgumentList '/name Microsoft.Language /page pageAdvanced'

这样可以让 Windows 上的普通日文输入工作正常。但这并不能保证 Kana 和 Eisu 这样的 Mac 特有按键会通过每一种远程控制应用都被完美传递。如果远程应用没有正确转发这些按键,Ubuntu 之后也无法还原出精确的原始硬件事件。

然后修复 Ubuntu XRDP 这一侧

在 Ubuntu 端,问题可以从键盘状态中看出来:

model:  pc105
layout: us

对于 Apple 日文键盘,Ubuntu 已经自带了更合适的 XKB 配置:

model:   applealu_jis
layout:  jp
variant: mac

这一行非常关键。它告诉 XRDP 内部的 X11 桌面,应当把传入的键盘解释为 Apple Aluminium JIS 键盘,并使用 Japanese Macintosh 变体。

你可以直接在 XRDP 会话里马上测试:

setxkbmap -model applealu_jis -layout jp -variant mac
setxkbmap -query

预期结果:

rules:      evdev
model:      applealu_jis
layout:     jp
variant:    mac

如果你需要通过 SSH 对一个正在运行的 XRDP 显示应用它,请使用当前活动的显示编号:

DISPLAY=:10.0 XAUTHORITY="$HOME/.Xauthority" 
  setxkbmap -model applealu_jis -layout jp -variant mac

你的显示编号可能是 :10.0:11.0,或者其他 XRDP 显示。

让它持久生效,但只针对 XRDP

除非你的所有本地控制台、VNC 会话和桌面路径都应该改成日文 Mac 布局,否则我不建议在整台机器上做全局切换。

对于这个场景,更稳妥的方案是在 ~/.xsessionrc 中加入一个仅针对 XRDP 的钩子:

export GTK_IM_MODULE=ibus
export QT_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export CLUTTER_IM_MODULE=ibus

if command -v ibus-daemon >/dev/null 2>&1; then
  if ! pgrep -u "$(id -u)" -x ibus-daemon >/dev/null 2>&1; then
    ibus-daemon -drx >/tmp/ibus-xrdp.log 2>&1 &
  fi
fi

if [ "${XRDP_SESSION:-}" = "1" ] && command -v setxkbmap >/dev/null 2>&1; then
  setxkbmap -model applealu_jis -layout jp -variant mac >/tmp/xrdp-setxkbmap.log 2>&1
fi

这样既保留了之前针对中日韩输入法的修复,也只会在会话是 XRDP 会话时额外应用 Apple JIS 键盘覆盖。

不需要整机重启。要测试持久化效果,只需退出 XRDP 桌面并重新连接。

中日韩输入是另一层问题

键盘布局和输入法彼此相关,但它们不是同一回事。

如果日文或中文输入在 Terminal 中正常,但在 Chrome、Firefox 或 Typora 中失败,也要检查 IBus 这一层。在这台机器上,有用的输入栈包括:

  • 通过 ibus-mozc 输入日文
  • 通过 libpinyin 输入中文拼音
  • 通过 table:wubi-jidian86 输入中文五笔
  • 在 GUI 应用启动前导出 IBus 环境变量

持久化部分仍然是上面同一个 ~/.xsessionrc 代码块:

export GTK_IM_MODULE=ibus
export QT_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export CLUTTER_IM_MODULE=ibus

这里最关键的经验是:浏览器和 Electron 应用通常要求在应用启动时 IME 环境已经存在。如果你在 Chrome 或 Typora 已经运行之后才修复 IBus,就需要重启这些应用,或者重新连接 XRDP 会话。

为什么不全局修改 XRDP?

/etc/xrdp/xrdp_keyboard.ini 可能已经知道日文 RDP 布局 ID 应该映射到 jp。在这个案例里,XRDP 并不是完全缺少日文支持,真正不匹配的是桌面会话内部的 XKB model 和 variant。

在会话中使用 setxkbmap 的侵入性更小:

  • 不会影响本地控制台行为。
  • 不会干扰 VNC。
  • 很容易移除。
  • 它明确记录了这条远程链路所依赖的假设。

如果这样做之后仍然有一两个特殊按键不正确,不要继续盲目地修改全局键盘设置。应当先在 XRDP 会话中捕获实际的 keycode,然后只重映射那个具体按键。

检查清单

对于这条 Mac -> Windows -> RDP -> Ubuntu 链路:

  1. 先让 Windows 端的日文输入可用。
  2. 在 Ubuntu XRDP 中测试 setxkbmap -model applealu_jis -layout jp -variant mac
  3. 把仅限 XRDP 的 setxkbmap 代码块放进 ~/.xsessionrc
  4. 在同一个文件里保留 IBus 环境变量,供 Chrome、Firefox、Typora 以及其他 GUI 应用使用。
  5. 重新连接一次 XRDP。
  6. 只有在 Kana 或 Eisu 仍然失败时,才针对实际转发过来的 keycode 做定向按键重映射。

这就是稳定的思维模型:Windows 处理自己的 IME 和布局;XRDP 转发远程键盘状态;Ubuntu 仍然必须为桌面会话选择正确的 XKB model、layout 和 variant。

Leave a Reply