「UTF-8」タグアーカイブ

PowerShellの構文エラー原因TOP3:全角引用符・NBSP・BOM

🧩 PowerShellの構文エラー原因TOP3:全角引用符・NBSP・BOM

PowerShellスクリプトを実行したときに、
UnexpectedToken」や「文字列に終端記号がありません」という赤エラーが出て動かない——。
そんな経験はありませんか?

実はこれらの構文エラー、文法ミスではなく「文字の種類」 が原因で起きていることが非常に多いです。
特に日本語環境では、以下の3つがPowerShellを混乱させる典型的なトラブル要因です。


🥇 第1位:全角引用符(“ ”、” ”)

最も多いのがこれ。
WordやWebサイト、ブログなどからコードをコピーした際に、
「普通のダブルクォート(")」が「全角のスマートクォート()」に変わってしまう現象です。

PowerShellはこれを文字列の区切りとして認識できません
そのため以下のようなエラーが出ます。

式またはステートメントのトークン '営業企画部' を使用できません。

🔧 対処法:

  • 全角の “ ” を半角の ” ” に置換

  • コードエディタで「スマートクォート自動変換」をOFFにする


🥈 第2位:NBSP(ノーブレークスペース)

見た目は半角スペースですが、内部的には U+00A0 という別の文字です。
HTMLページやブログからコピーしたときに非常によく混入します。

PowerShell上では、
「半角スペースとして解釈されない」ため構文が崩れ、
UnexpectedToken などの不可解なエラーが出ます。

🔧 対処法:

  • サクラエディタやVS Codeで「不可視文字表示」をONにする

  • 以下のコマンドでNBSPやゼロ幅文字を除去可能:


🥉 第3位:BOM付きUTF-8で保存されている

UTF-8自体はPowerShellでも推奨されていますが、
「BOM(Byte Order Mark)」付きUTF-8 で保存された .ps1
スクリプトの先頭に見えない U+FEFF が混入し、これが原因で構文エラーになる場合があります。

🔧 対処法:

  • ファイルを UTF-8(BOMなし) で保存

  • サクラエディタやVS Codeで「保存形式:UTF-8(BOMなし)」を明示的に選択


✅ エラーを防ぐためのおすすめ設定

PowerShellのスクリプトを書くときは、以下の設定を徹底すると安心です。

・エンコード:UTF-8(BOMなし)
・行末コード:CRLF
・クォート文字:必ず半角(" または ')
・不可視文字表示:ON
・自動変換(スマートクォート、全角変換など):OFF

🧰 トラブルを一掃するワンライナー

既におかしな文字が混入している場合は、
次のPowerShellコマンドでクリーンアップできます。

これで、全角クォート・NBSP・BOMをすべて除去できます。


🚀 まとめ

PowerShellの構文エラーの多くは「コードが壊れている」のではなく、
文字の種類が混ざっているだけ です。

  • “全角クォート” → 半角 " " に直す

  • “NBSP” → 普通のスペースに置換

  • “BOM付きUTF-8” → BOMなしに保存

この3点を意識するだけで、
もう意味不明な赤いエラーに悩まされることはありません。

CSVファイルの 「BOMあり」、「BOMなし」とは?

  • はじめに

    CSVファイルを扱っていると、「BOMあり」「BOMなし」という言葉を目にすることがあります。
    特にExcelで開いたときに文字化けしてしまった経験がある方は、この違いが大きな意味を持つことを知っておくと便利です。
    この記事では、BOMの基礎から、Excelやシステムでの扱い方、確認方法まで解説します。


    BOMとは?

    BOM(Byte Order Mark)は、テキストファイルの先頭に付与される特殊な「目印」です。
    文字コードを示すために使われ、特にUTF-8では以下の3バイトがBOMになります。

    EF BB BF

    これがあるファイルを「BOMあり」、ないファイルを「BOMなし」と呼びます。


    BOMありとBOMなしの違い

    BOMあり

    • Excelなどで開くと文字化けしにくい

    • 日本語環境のExcelではBOM付きの方が安全に扱える

    BOMなし

    • Linux系のシステムやプログラムでは一般的

    • 余計なバイトが含まれないためシステム連携や自動処理で好まれる


    Sakuraエディタで違いが分からない理由

    Sakuraエディタはとても優秀で、UTF-8のBOMがあってもなくても正しく解釈して表示します。
    そのため、見た目では違いが分からないのです。
    他のソフトでは「」のような文字が先頭に表示されることもありますが、Sakuraではそうした問題は起きません。


    BOMの有無を確認する方法

    1. Sakuraエディタで確認

    • メニュー → ファイル文字コード指定して開く

    • 「UTF-8」または「UTF-8 (BOM付き)」が表示される

    2. バイナリエディタで確認

    • BOMあり:ファイル先頭に EF BB BF

    • BOMなし:すぐに「ID,名前,点数」などの内容が始まる

    3. コマンドで確認

    • Windows (PowerShell)



      → BOMありなら 239 187 191 が表示されます

    • Linux

      xxd -l 3 sample.csv

      → BOMありなら ef bb bf が確認できます


    利用シーン別の使い分け

    利用シーン おすすめ設定 理由
    ExcelでCSVを開く場合 BOMあり(UTF-8 BOM) 文字化けを防ぎ、正しく読み込める
    プログラムやLinux環境で処理 BOMなし(UTF-8) 不要なバイトがなく安定処理できる
    BOMの有無を確認したい場合 バイナリやコマンド 確実に判別可能

    まとめ

    CSVファイルの「BOMあり/なし」は目で見える違いはなく、特にSakuraエディタではどちらでも正しく開けます。
    しかし、Excelでの文字化けやシステム連携時の不具合を避けるためには、利用シーンに応じた使い分けが重要です。

    • Excel → BOMあり

    • プログラム処理 → BOMなし

    ぜひ状況に合わせて正しく選択してください。

BOMありのサンプル例

sample_bom

BOMなしのサンプル例

sample_no_bom

SQL:全角文字と半角文字を判定する方法

SQLで全角文字と半角文字を判定するにはLENGTHBやOCTET_LENGTH関数で取得したバイト数とLENGTH関数で取得した文字数を比較することで判断することができます。

使用例

  • サンプルテーブル「goods」
  • クエリー(SQL)

    ORACLEの場合はOCTET_LENGTHをLENGTHBへ変更すれば同様の結果を得られます。

  • 出力結果

補足

1. 判定ロジックの背景と利用ケース

  • 全角文字・半角文字を判定する目的として、データ品質管理(例:ユーザー登録時の文字種チェック)、システム移行時の文字コード整合性確認、レポートや印刷用データの整形などが考えられます。

  • 特にマルチバイト文字(日本語)環境では、1文字あたりのバイト長が異なるため、バイト長と文字数のずれを利用した判定が有効です。

  • 本記事で紹介されているように、例えば PostgreSQL の LENGTH()OCTET_LENGTH() の比較を使う方法はシンプルでクロスプラットフォームにも応用可能です。

2. 各データベースでの関数違い・注意点

  • PostgreSQL:文字数を返す LENGTH(text)、バイト長を返す OCTET_LENGTH(text) を使う。
    例:WHERE length(col) <> octet_length(col)

  • Oracle:Oracle には直接 OCTET_LENGTH がないが、LENGTHB() がバイト長を、LENGTH() が文字数を返す(ただしCHAR型/NCHAR型、CHARSET設定によって挙動が異なる)ので、LENGTHB(col) <> LENGTH(col) という書き方が使えます。

  • MySQL:CHAR_LENGTH(col) が文字数、LENGTH(col) がバイト数を返すので、CHAR_LENGTH(col) <> LENGTH(col) といった判定が可能。

  • SQL Server:LEN() が文字数(末尾の空白はカウントされない)、DATALENGTH() がバイト長(文字コード依存)を返すので、環境次第では LEN(col) * 2 <> DATALENGTH(col) などと併用するケースがあります。

  • 注意点として、文字コード(UTF-8、UTF‐16、Shift_JIS 等)が環境によって異なると「半角=1バイト」「全角=2バイト」という前提が崩れる場合があります。特にUTF-8では日本語全角文字が3バイトある場合もありますので、バイト数の比較ロジックを適用する際は対象の文字コードを意識してください。

3. 実運用的な工夫・パフォーマンス面の注意

  • 大規模テーブルでこのようなチェックを行う場合、たとえば WHERE LENGTH(col) <> OCTET_LENGTH(col) のような関数を大量の行に対して実行するとインデックスが効かず、全表スキャンになる可能性があります。

    • 解決策:バッチ処理的に時間帯を分けて実施、あるいはチェック専用にサマリテーブルを用意する。

    • また、事前に「文字種/文字コード/想定バイト数」などのデータ仕様を設け、そもそも混在しないように制御するのが望ましいです。

  • 判定だけでなく、誰がいつどのレコードを修正したか(=トレーサビリティ)を残すなら、更新日時・更新者カラムを活用して「チェック済み/要修正」などのフラグを設けると管理しやすくなります。

  • 将来的に正規表現(REGEXP)や文字列関数(例えば Unicode プロパティを利用した判定)を使って「半角カタカナ」「全角英数字」「漢字のみ」などより細かく制御したい場合も多いため、可能ならその準備もしておくと良いでしょう。

4. よくある誤り・ハマりどころ

  • 前提として「文字数とバイト数が異なる=全角含む」という仮定をしているため、 半角カタカナ絵文字(マルチバイト4バイトなど) が含まれていると誤検知される可能性があります。たとえば、UTF-8環境で絵文字が4バイトなので「文字数1、バイト数4」→「異なる」と判定されてしまう。

  • 文字コード設定の違い:テーブル/カラムごとに異なる照合順序・文字セットが指定されていると、バイト数や文字数の挙動が予想と異なることがあります。例えば MySQL で utf8mb4 を使っているなら日本語全角文字が3バイトではなく4バイトになるケースあり。

  • 更新系の処理で「半角に変換された/全角に変換された」履歴を残していないため、修正したデータが「元はどちらだったか」が分からなくなるという運用上のリスク。必要に応じて「修正前の値」保持やログ出力を検討するべきです。

5. 具体的な応用例・コードスニペット

PostgreSQL での運用例

MySQL での運用例

Oracle での運用例

6. フォローアップ可能な内容・発展トピック

  • 正規表現を用いて「全角ひらがな」「全角カタカナ」「全角英数字」「半角英数字」などを分類・抽出する方法。

  • 文字種に応じて別テーブルへアーカイブ・除外といったワークフロー設計。

  • BI/レポート用途で「文字種別カウント」を可視化する方法(例:Excel/Tableau/BIツールを用いた文字種分布グラフ化)。

  • 外部システム(CSV/Excel)からデータインポート時に「文字種チェック+自動整形(全角→半角、半角→全角)」を組み込むETL(Extract-Transform-Load)設計。

  • 将来的に多言語対応を視野に入れた「Unicodeカテゴリ判定」(たとえば、CJK文字・ラテン文字・Emoji など)を含めた文字種チェック。