質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

5378閲覧

encoding japaneseで文字列から、変換された文字コードの文字列を取得する

退会済みユーザー

退会済みユーザー

総合スコア0

Node.js

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/04/17 06:55

編集2019/04/17 08:13

https://www.npmjs.com/package/encoding-japanese

こちらのライブりを使って、変数に格納されたSJISの文字列をUTF8の文字列に変換しようとしたのですが、うまくできませんでした...。

js

1let text = 'あ' // 実際textはエクセルからインポートされた文字列でSJISです 2text = Encoding.convert(text, { to: 'UTF8', from: 'SJIS', type: 'string' })

はじめこれでできるのかなと思ったのですが、"?"が返ってきます。
こちらのページでは文字列は

var utf8String = 'ã\u0081\u0093ã\u0082\u0093ã\u0081«ã\u0081¡ã\u0081¯';

こんな風になってます。
これは一体どういった形式なのでしょうか。

textをこの形式に一旦変換してからEncoding.convertしてみようかなと思うのですが、それは可能なのでしょうか。


追記

js

1 2// textはSJISの"あ" 3 4text = convertSjisStrToUtf8Str(text) // => [63] 5 6const convertSjisStrToUtf8Str = (sjisStr) => { 7 let ary = [] 8 for (let index = 0; index < sjisStr.length; index++) { 9 ary.push(sjisStr.charCodeAt(index)) 10 } 11 return Encoding.convert(ary, 'UNICODE', 'SJIS') 12}

追記
SJISのファイルの作り方

js

1// 参考サイト 2// https://photo-tea.com/p/17/nodejs-write-excel-tsv-csv/ 3// fsじゃなくてfs-extraを使ってます 4import * as fs from 'fs-extra' 5import iconv from 'iconv-lite' 6let csvStr = 'あ' 7fs.writeFileSync(outputFilePath, '') 8let fd = fs.openSync(outputFilePath, 'w') 9let buf = iconv.encode(csvStr, 'Shift_JIS') 10await fs.writeSync(fd, buf, 0, buf.length)

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lhankor_Mhy

2019/04/17 07:07

「実際textはエクセルからインポートされた文字列でSJISです」とありますが、textの型はなんですか?
退会済みユーザー

退会済みユーザー

2019/04/17 07:18

ストリングです! 内部的なデータ形式がSJISになってます。
退会済みユーザー

退会済みユーザー

2019/04/17 07:18

なのでそのまま画面に出すと文字化けします
Lhankor_Mhy

2019/04/17 07:42

当該ライブラリのexampleにあるように、UNICODEで書き出すのではダメなのですか?
退会済みユーザー

退会済みユーザー

2019/04/17 07:52

大丈夫です。 追記も加えてみたので良かったらみてみてください...。
退会済みユーザー

退会済みユーザー

2019/04/17 07:55

でも文字化け後のテキストから本来のテキストを取り出すのは無理という記事も見つけました http://var.blog.jp/archives/71651044.html
退会済みユーザー

退会済みユーザー

2019/04/17 07:56

csvからのデータのインポートからやり直さなければいけないのでしょうか ちなみにデータのインポートは https://www.npmjs.com/package/csvtojson こちらのライブラリを使っております...
Lhankor_Mhy

2019/04/17 08:05

当方とは違う結果でした。 textの中身がなんか違いそうですね……
退会済みユーザー

退会済みユーザー

2019/04/17 08:08

なるほどです csvファイルの作り方を追記します そっちに問題があるのかもしれないです
Lhankor_Mhy

2019/04/17 08:29

あ、text.length が 1 なんじゃないですかね? だとすると、Uint16Arrayで受けて、Arraybuffer にするのはどうでしょう?
退会済みユーザー

退会済みユーザー

2019/04/17 08:34

すみません、 Uint16Arrayで受ける?とはどのような意味でしょうか(T_T)
退会済みユーザー

退会済みユーザー

2019/04/17 08:39

すみません、ちょっと使い方が分かりません(T_T)
guest

回答1

0

ベストアンサー

これはどうでしょう?

js

1text = '\u82a0'; // shift-jis ”あ” 2 3let ary = new Uint16Array(1); 4ary[0] = text.charCodeAt(0); 5let unicodeArray = Encoding.convert(new Uint8Array(ary.buffer), { to: 'UNICODE', from: 'SJIS'}) 6console.log( Encoding.codeToString(unicodeArray) ); 7// あ

投稿2019/04/17 08:54

Lhankor_Mhy

総合スコア36074

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/04/17 09:32

すみません、もともと取り込んだ時点で文字化けがされていて、''\u82a0''そもそもこのような形のデータがありませんでした。 そこで文字化けする前の生のバイナリデータに対してデコードすることで対処できました。 let csvStr = await fs.readFileSync(filePath) let decodedCsvStr = iconv.decode(csvStr, 'windows-31j') これでできました。 一緒にすごい考えてくださり、本当にありがとうございました。
Lhankor_Mhy

2019/04/17 09:44

それはその方がいいですね(w ご解決されて何よりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問