質問するログイン新規登録

Q&A

解決済

1回答

804閲覧

Node.js 業務上利用する必要のあるスクリプトで出力されたCSVファイルが文字化けしてしまい、文字コードを変更しても修正できない

numin

総合スコア41

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

1グッド

1クリップ

投稿2024/08/08 04:40

編集2024/08/08 07:04

1

1

実現したいこと

仕事で利用する必要のある下記スクリプトをWindows 10 端末のNode.jsで実行し、ウェブアクセシビリティチェックを実施すること

※先日投稿させていただいた、下記の質問と同スクリプトに関する内容となります。

五月雨式の質問となってしまい、申し訳ありません。

※参考サイト: GitHub 「axe-test.js」

前提

※基礎知識の全くない状態にも関わらず業務でNode.jsを利用し特定のスクリプトを実行することを求められている状況なので、見当違いな内容を記載している可能性がありますが、ご容赦ください。

先日投稿した質問内容につきましては、ご丁寧に解説していただけたおかげで無事解決しました。 ご助言いただき、ありがとうございました。

この度は改めて下記スクリプトをNode.jsで実行したところ、出力されたCSVファイルの日本語の箇所が文字化けしてしまい、またメモ帳等から文字コードを変更しても改善されない状況となってしまっています。

スクリプト本体の修正・出力後にできる対策等方法は問いませんので、文字化けせずに内容を確認できるようになる手段をお教えいただけないでしょうか。

なお、あまり時間がないため、もし解決方法をご存じの方がいらっしゃいましたら、できるだけ早くご教示いただければ幸いです。

発生している問題・エラーメッセージ

出力されたCSVファイル(出力時点での文字コードはUTF-16 LE)で、下記の通り日本語の箇所のみが文字化けしてしまっています。

○result.csv

URL,Volation Type,Impact,Help,HTML Element,Messages,DOM Element https://www.xxx.com/,color-contrast,serious,https://dequeuniversity.com/rules/axe/4.9/color-contrast?application=axe-puppeteer&lang=ja,<a href="" data-slide-index="1" class="bx-pager-link">2譫夂岼縺ョ繧ケ繝ゥ繧、繝峨r陦ィ遉コ</a>,隕∫エ縺ョ繧ウ繝ウ繝医Λ繧ケ繝域ッ斐′荳榊香蛻・〒縺・4.1・亥燕譎ッ濶イ: #003333縲∬レ譎ッ濶イ: #8c8c8c縲√ヵ繧ゥ繝ウ繝医し繧、繧コ: 0.0pt (0px)縲√ヵ繧ゥ繝ウ繝医・螟ェ縺・ bold・峨€ゅさ繝ウ繝医Λ繧ケ繝域ッ・.5:1繧貞ソ・ヲ√→縺励∪縺・a[data-slide-index="1"] ...

○ターミナル上に出力させた場合

URL,Volation Type,Impact,Help,HTML Element,Messages,DOM Element https://www.xxx.com/,color-contrast,serious,https://dequeuniversity.com/rules/axe/4.9/color-contrast?application=axe-puppeteer&lang=ja,<a href="" data-slide-index="0" class="bx-pager-link">1枚目のスライドを表示</a>,要素のコントラスト比が不十分です 4.1(前景色: #003333、背景色: #8c8c8c、フォントサイズ: 0.0pt (0px)、フォントの太さ: bold)。コントラスト比4.5:1を必要とします,a[data-slide-index="0"] ...

該当のソースコード

○ダウンロードした「axe-test.js」

※必要となるPuppeteer、axe-core、axe-reportsは参考サイトの手順通りにインストール済みです。

JavaScript

1const { AxePuppeteer } = require('@axe-core/puppeteer'); 2const puppeteer = require('puppeteer'); 3 4// テスト結果を日本語で出力するように設定する。 5const AXE_LOCALE_JA = require('axe-core/locales/ja.json'); 6const config = { 7 locale: AXE_LOCALE_JA 8} 9 10// テスト結果の出力に、axe-reports を使用するように設定する。 11const AxeReports = require('axe-reports'); 12 13// テスト対象の URL を、外部テキストファイルから読み込んで、配列に整形する。 14const fs = require('fs'); 15let urls_list = fs.readFileSync("./urls.txt", "utf-8"); 16urls_list = urls_list.replace(/\r?\n/g, ','); 17urls_list = urls_list.split(','); 18 19(async () => { 20 21 const urls = urls_list 22 23 // axe-reports で、見出し行をまずは作成する。 24 AxeReports.createCsvReportHeaderRow(); 25 26 const browser = await puppeteer.launch(); 27 28 for (let i = 0; i < urls.length; i++) { 29 30 const url = urls[i]; 31 const page = await browser.newPage(); 32 await page.setBypassCSP(true); 33 34 // デバイスのエミュレートをする場合は、下記を適用する。 35 // await page.emulate(puppeteer.devices['iPhone 8']); 36 37 // ページを読み込む。 38 await Promise.all([ 39 page.setDefaultNavigationTimeout(0), 40 page.waitForNavigation({waitUntil: ['load', 'networkidle2']}), 41 page.goto(`${url}`) 42 ]); 43 44 // テストを実行する。withTags で、テスト基準をいろいろ設定できる。 45 const results = await new AxePuppeteer(page).configure(config).withTags(['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa', 'best-practice']).analyze(); 46 47 // axe-reports で、検証結果の行を追加する。 48 AxeReports.createCsvReportRow(results); 49 50 await page.close(); 51 } 52 53 await browser.close(); 54 55})();

○スクリプトの実行コマンド

node axe-test.js > result.csv

試したこと

下記の順番で試みましたが、何れも失敗しています。

(1) メモ帳で開き、「名前を付けて保存」から文字コードを「ANSI」に変更して保存

→メモ帳で開きなおすとステータスバーの表示が「ANSI」に代わっているものの、文字化けしている箇所には変化なし
※その後、UTF-8・UTF-16等指定できる文字コード全てで試しました。

(2) axe-test.js本体の編集

→ウェブで調べて「iconv-lite」や「encoding-japanese」等を導入、書き出す直前の「results」をShift_JISに変換する指示を追記してみましたが、結果には変わりありませんでした。

(3) Pythonで作成した文字コード変換プログラムの適用

→chardetライブラリのdetectメソッドで出力されたCSVファイルの文字コードを検出・検出された文字コードにて元ファイルの内容を読み取り・新たに作成したShift_JIS使用のファイルに内容を転記するというプログラムを作成し適用しましたが、結果は1番と同じく、「文字コードは変わるのに文字化けした箇所は変化なし」という結果になりました。

補足情報(FW/ツールのバージョンなど)

Node.jsのバージョンは20.16.0を利用しています。

頂いたコメントに関する補足等

  • 「出力時、CSVファイルがUTF-16 LEだった」ことの根拠につきましては、Pythonのchardet.detectで検出させprintで表示させた内容が「UTF-16」であったことと、メモ帳で開いたさいにステータスバーに「UTF-16 LE」と表示されていたことの2点です。
  • サクラエディタでファイルを開く際に「SJIS」を指定しましたが、表示内容には変化がなく、文字化けしていた箇所も同じでした。
  • 実行環境はWindows 10のWindows Power Shellです。
  • 「chcp」コマンドの結果、「現在のコード ページ: 932」と表示されました。

以上です。

何卒よろしくお願いいたします。

juner👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

TakaiY

2024/08/08 05:15

> 出力されたCSVファイル(出力時点での文字コードはUTF-16 LE) とありますが、これの根拠は何ですか? メモ帳で開いた後にコードを変更して保存という操作をしているようですが、「開くとき」に文字コードを指定できるエディタなどで開くとどのようになりますか?
numin

2024/08/08 05:52

コメントを頂きありがとうございます。 まず >> 出力されたCSVファイル(出力時点での文字コードはUTF-16 LE) > とありますが、これの根拠は何ですか? につきましては、まずPythonのchardet.detectで検出・printさせた際に「UTF-16」と出力されたことと、メモ帳で通常通り開いた際にステータスバーに「UTF-16 LE」と表示されたことから判断いたしました。 > メモ帳で開いた後にコードを変更して保存という操作をしているようですが、「開くとき」に文字コードを指定できるエディタなどで開くとどのようになりますか? につきましては、サクラエディタをダウンロード後、開く際に「SJIS」を指定しても文字化けしている箇所に変化はありませんでした。 以上です。 質問の本文にも追記いたします。 よろしくお願いいたします。
juner

2024/08/08 06:32 編集

確認なのですが `> result.csv` をつけずに実行した場合、日本語部分は化けていますでしょうか? また、コマンドの実行環境は コマンドプロンプトでしょうか? powershell でしょうか? pwsh でしょうか? chcp コマンドを実行すると コードページが何であると言っていますでしょうか?
numin

2024/08/08 07:01

コメントを頂きありがとうございます。 まず` > result.csv`を指定しなかった場合の表示につきましては、「○ターミナル上に出力させた場合」の下に記載しております通り、文字化けせずに表示されています。 実行環境につきましてはWindows 10のWindows Power Shellを利用しており、chcpコマンドの結果は「現在のコード ページ: 932」というものでした。 本文にも追記いたします。 よろしくお願いいたします。
juner

2024/08/08 07:14 編集

ということは $OutputEncoding がどうなってるか気になるやつですね。 多分 この記事でやってる方法で解決できそうな気がします。 https://qiita.com/teruroom/items/5844b103434e7e4ac9e1 つまり 対象のコマンドの前に $PSDefaultParameterValues['Out-File:Encoding'] = 'utf8' を実行してからやると utf-8 で保存されないかなという話です。
numin

2024/08/08 07:38

ご教示いただきありがとうございます。 頂いたURLのページも確認した上で`$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'`を実行してみたのですが、その後に再度出力させたファイルでも文字化けしてしまっているようでした。 なお、今回出力されたファイルの文字コードはメモ帳によると「UTF-8 (BOM 付き)」で、今回もANSIなど他の文字コードへの変更はできませんでした。 以上です。 よろしくお願いいたします。
numin

2024/08/08 08:12

junerさん 度々ご回答を頂き、ありがとうございます。 先ほどご返信しました通り `$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'` だけでは上手く出力されなかったのですが、頂いた情報をヒントに調べてみたところ、下記記事に書かれているスクリプトファイルの作成・実行で正しくUTF-8で出力されるようになりました。 (https://qiita.com/e4rfx/items/3772ecb58b6918ed5348) 今回解決につながったコメントはjunerさんから頂きましたので、宜しければベストアンサーに選べるよう、コメントしていただいた内容を回答欄に投稿していただけますでしょうか。 よろしくお願いいたします。
juner

2024/08/08 08:15

いえ、この経緯を 書いた上で自己解決とされた方が良いと思われますのでよろしくお願いします。
TakaiY

2024/08/08 08:17

まず、リダイレクトしなければ正しく表示されるとうことは、テキストファイルの中の情報は正しいはず。(確信はない) とすると、開くときの文字コードの指定が間違えているとしか思えない。 > サクラエディタでファイルを開く際に「SJIS」を指定 他の UTF-8などいろいろな物を指定しても同様でしょうか? UTF-8にすればいいと思うのですが。 リダイレクトしたファイルと、開いているファイルは同じものでしょうか。 リダイレクト先のファイルを result_2.csvなど別のものにしてそれを開いてみてはどうでしょうか。
otn

2024/08/08 11:07

明記されてませんが、 > メモ帳で開いたさいにステータスバーに「UTF-16 LE」と表示されていたことの2点です。 と、 > メモ帳で開きなおすとステータスバーの表示が「ANSI」に代わっているものの、文字化けしている箇所には変化なし から推察すると、 > メモ帳で開いたさいにステータスバーに「UTF-16 LE」と表示されていたことの2点です。 の時点ですでに文字化けがあったと言うことでしょうから、そのファイルはUTF-16LEじゃないです。 UTF-16 LEと表示されて、日本語文字が全部正しく読めれば UTF-16 LEですが。
hiroki-o

2024/08/08 11:14

UTF-8をShift_JISで開いたときの化け方ですね。いろいろ隠していることがあるのでしょう。
numin

2024/08/08 14:24

> junerさん ありがとうございます、承知しました。 それでは敬意をご説明した上で、自己解決という形で投稿させていただきます。 ありがとうございました。 > コメントを頂きました皆様 数々のご助言、ありがとうございました。 本件につきましてはコメント#3〜#7のやり取りで一先ず解決しております。 「なぜメモ帳から全種類の文字コードに変更して保存しても文字化けしたままだったのか」や「なぜ各文字コードを指定した上で開いても文字化け箇所が全く変わらなかったのか」など気になるところはまだ残っていますが、現状は急ぎ業務上必要なスクリプトを動作させることができ、似たような状況で再発が防げるようになったことから、こちらの質問については解決済みとさせていただきたいと思います。 中途半端な締め方になってしまい恐縮ではありますが、よろしくお願いいたします。
hiroki-o

2024/08/08 14:56

もともとresult.csvはUTF-8です。間違えてShift_JISで開いただけの話。そういう化け方。
TakaiY

2024/08/09 04:36 編集

解決していますが、誤解があるようなのでコメントします。 > 「なぜメモ帳から全種類の文字コードに変更して保存しても文字化けしたままだったのか」 たいていのエディタは、特定の文字コードを内部表現用として使っていて、読み込む時にファイルの内容をその文字コード変換して保持しています。この変換時にファイルの文字コードが間違えていると「文字化け」した状態な内部に保持されます。なので画面に表示したときに文字化けしてしまっているということはこの内部表現が文字化けしているということです。よって、それを文字コードを変更して保存しても化けたままです。 > 「なぜ各文字コードを指定した上で開いても文字化け箇所が全く変わらなかったのか」 これについては文字コードを指定して開く操作が間違えているとしか思えません。特にUTF-16LEなどは、ASCII領域の文字 ですら表示されなくなるはずなので。
numin

2024/08/09 05:40

Junerさん、TakaiYさん、解決後も詳しくご解説いただきありがとうございます。 UTF-16LEとして扱われた件・メモ帳で文字コードを変更して保存しても文字化けが直らなかった件につきまして、納得できました。 また情報の後出しのような形になってしまい大変申し訳ないのですが、私自身全くの全盲で、サクラエディタ等高機能テキストエディタの多くがスクリーンリーダー(音声読み上げ機能)による操作に対応していなかったため、そもそも文字コードの選択・表示文字列のOCR読み取り等が適切に行えていなかったのかもしれません。 そのため、「文字コードを指定して開いた時」につきましては、再現性・正確性に欠ける情報となってしまっていたかもしれません。 大変失礼いたしました。
TakaiY

2024/08/09 06:28

そういう事情があったのですね。 エディタなどは、情報が詰め込まれているのでスクリーンリーダなどでの対応は、ユニバーサルデサインという観点からも、必要なのでしょうけど難しそうですね。
hiroki-o

2024/08/09 14:26

なんか私だけ間違ったことを言っているような流れになっていますが、result.csvはUTF-8をShift_JISで開いたときの化け方です。 スクリーンリーダーだと区別がつかないかもしれませんが、化け方にはパターンがあります。 心ある方は理解してください。
numin

2024/08/09 15:08

> TakaiYさん そうですね... アクセシビリティの高さから選んでしまうとやはりメモ帳に頼り切りになってしまうことがおおいので、こういったエンコーディングの問題などに柔軟に対応できなくなっているのかもしれません。 こうした状況に自ら対応できるよう、スクリーンリーダーで操作できるツールの開拓もしていきたいと思います。 ありがとうございました。 > hiroki-oさん 私の知識不足のせいで頂いたコメントに対する検証・ご返答ができず、失礼いたしました。 最終的な解決策として「デフォルトでShift_JISになっているWindows Power Shellの入出力文字コードをUTF-8に合わせる」という対応を実施しましたため、実際にhiroki-oさんの仰る通り根本的な問題はツールによって渡されたUTF-8の文字列がShift_JISで出力されてしまったというところだったのかと思います。 ただ、junerさんやTakaiYさんにご解説いただいたように、検出された文字コードがWindows Power Shellによる処理のためかUTF-16と誤認識されていたことや、メモ帳による文字コードの変更で対応できなかったことなどが重なり、複雑に考えてしまっていたのかと思います。 度々お知恵を借りていたのにも関わらず、ご返信が遅くなってしまい申し訳ありませんでした。 ご助言を頂き、ありがとうございました。
guest

回答1

0

自己解決

結論

本件につきましては、コメントで頂いたご助言を基に対応方法を調べていたところ、下記記事を発見し、そちらに書かれていた手順を実施することで問題が解決できることを確認できました。

詳しい流れにつきまして、以下に記載いたします。

解決までの流れ

出力されるCSVファイルについては他の文字コードへ変更し保存しなおしても、各文字コードを指定してから開いても文字化けしている箇所に全く変化がなかったため、出力後に修正するよりも出力の段階で対処する必要があるのではないかと考えておりました。

そんな中、コメント欄で使用しているコマンドの実行環境や実行環境側の文字コードについてご確認いただき、「Power Shellにおける文字コードの違い」が原因なのではないかという流れになりました。

最終的には下記記事に記載されている方法でPower Shell内の各種エンコーディングをそれぞれUTF-8に変更したところ、無事文字化けしない形でCSVファイルを出力させることができるようになりました。。

参考サイト

(https://qiita.com/e4rfx/items/3772ecb58b6918ed5348)

コメント欄にて知恵を貸していただけた皆様、ありがとうございました。

投稿2024/08/08 14:38

numin

総合スコア41

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問