1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DeepLによりダブルクォート(")がスマートクォート(“)に変化しコマンドが動かなくなる問題

Posted at

最初にざっくりまとめ

  • 原因:翻訳する際、DeepLを使用しそのままバッチ用のコマンドごと翻訳し、相手方へ送信してしまった
  • 起きる現象:DeepLの自動体裁補正" "“ ”' '‘ ’ に置換される
  • 問題点rails runner "..." のようなコマンドや、文字列のコードなど、実行不能(例:NameError: undefined local variable or method

対策:コードは翻訳せず、文章翻訳後に直接貼り付けること(ぶっちゃけこれだけです)

  • ほかの対策方法
    • コードを翻訳対象から隔離(Markdownコードブロックやタグで保護)
    • 翻訳後にスマートクォートを機械置換(sed/PowerShell)
    • DeepL API を使う場合は体裁補正抑制タグ無視でガード(詳細は引用参照)

背景と経緯

仕事で英語圏のエンジニアとのやり取りで DeepL を使ってバッチのコマンドごと翻訳し相手方へ送信
→ 相手方がコマンドをそのままコピーし、ターミナルに貼り付けて実行してもらったところ失敗。
→ お互い目視で確認するが、コマンド自体はあっているように見えていたため、原因に気づくまでに時間がかかった。

なので、ちょっとした注意喚起というかメモみたいな感じで書いてます。

また、ログを見ると、コマンド内のダブルクォートが “スマートクォート(曲がった引用符)に変換され、Ruby が文字列リテラルとして解釈できずエラーになっていた。

エラーメッセージ例:

NameError: undefined local variable or method `“Batch' for main:Object

ASCIIの " ではなく U+201C/U+201D(“ ”)が混入していたのが直接原因。


なぜ起きるのか

  • 翻訳ツールDeepLの体裁補正:読みやすさ重視で、まっすぐなクォート(" "/' ')を自動で (“ ”/‘ ’) に変えてしまう

どんな影響が出るか

アプリ側(Ruby/Python等)が識別子として誤解釈して落ちる。他だと下記などが考えられる。

  • 設定ファイル破損:JSON/YAML/ENVなどでパースエラー
  • コードレビュー事故:PR内に曲がった引用符が混じり、将来の実行時に失敗

再現例

# NG(スマートクォート)
rails runner “Batch::CourseContinuationWorker.perform”

# OK(ASCII)
rails runner "Batch::CourseContinuationWorker.perform"

実務対策

1) コード/コマンドは翻訳させない

  • 文章は DeepL、コードは原文を貼る

  • 正直、シンプルにこれだけで解決だと思います

  • レビュー:PR/ドキュメントにスマートクォートが無いか最低限の目視確認

2) API版DeepLを使う

  • 基本的な使い方

コードやコマンドを崩したくないときは、以下のような感じで設定(併用可):

  • preserve_formatting: true を付ける

  • タグでガード:翻訳前にコマンドを <keep></keep> で囲い、tag_handling=xml, ignore_tags=["keep"] を指定(囲い部は未翻訳・未整形でそのまま返る)

  • JSON例:

{
  "text": ["実行コマンドは <keep>rails runner \"Batch::CourseContinuationWorker.perform\"</keep> です"],
  "target_lang": "EN-GB",
  "tag_handling": "xml",
  "ignore_tags": ["keep"],
  "preserve_formatting": true
}

3) 自動置換(翻訳“後”に一括修正)

量が多くなってしまった場合や相手から送られてきた場合などの対策として

UNIX系(sed)

# “ ” を " に、‘ ’ を ' に
sed -e 's/[“”]/"/g' -e "s/[‘’]/'/g" input.txt > output.txt

PowerShell

(Get-Content input.txt) `
  -replace '[“”]','"' `
  -replace '[‘’]',"'" |
Set-Content output.txt

Node.js(小スニペット)

const fs = require('fs');
const s = fs.readFileSync('in.txt','utf8')
  .replace(/[“”]/g, '"')
  .replace(/[‘’]/g, "'");
fs.writeFileSync('out.txt', s);

4) CI/フックで検知・強制

Git pre-commit(bash)

#!/usr/bin/env bash
set -euo pipefail
bad=$(git diff --cached --name-only --diff-filter=ACM | xargs -r grep -n -P "[\x{2018}\x{2019}\x{201C}\x{201D}]" || true)
if [ -n "$bad" ]; then
  echo "❌ スマートクォート検出(U+2018/2019/201C/201D)。ASCIIの ' \" に直してください。"
  echo "$bad"
  exit 1
fi

検出対象

  • (U+2018), (U+2019), (U+201C), (U+201D)

5) 執筆・編集環境の設定を利用

  • スマート引用符の無効化:可能ならエディタ/IME/OSのスマート句読点設定を OFF
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?