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

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

新規登録して質問してみよう
ただいま回答率
85.35%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Node.js

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

2回答

4905閲覧

Amazon AWS Lambda@Edge(Node.js)で文字コード「Shift_JIS」として出力するにはどうすればいいですか

qwe001

総合スコア133

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Node.js

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

1クリップ

投稿2020/02/04 09:30

PHPの「mb_convert_encoding($str, 'Shift_JIS', 'UTF-8')」と同じことがしたいです。

私は今、PHPで出来たシステムをnode.jsに移行することを検証中です。

node.jsというモダンな開発環境なのに、ガラケー用サイトの対応が必要でして、
どうしてもShift_JISの文字コードでHTMLページを表示しなければいけません。
(User Agentで判別して、DoCoMoとかならガラケー用ページのHTMLテンプレートを表示する感じです)

ネットで調べると、SJISその他からUTF-8に変換するものはよく見かけますが、
その逆で、UTF-8からSJISに変換するという記事を全然見かけません。

Node.jsではそういったことが出来ないのですか?

やり方をご存知の方、ソースコードをご提示いただけませんでしょうか。

もしNode.jsでは対応できないのであれば、
EC2を使うなど、別の方法を考えることにします。

一応、私のソースコードを下記します。

現在は検証中の段階ですので、
ライブラリはICONVやJCONVなど、違うものでも全然構いません。

function encodeTo(unicodeStr, toEncode = 'SJIS') { var ENCODING = require('encoding-japanese'); var availableEncodings = ['UTF16','UTF16BE','UTF16LE','JIS','UTF8','EUCJP','SJIS','UNICODE']; if(availableEncodings.includes(toEncode) === false){ return false; } var unicodeArray = ENCODING.stringToCode(unicodeStr); var utf8Array = ENCODING.convert(unicodeArray, { to: 'UTF8', from : 'UNICODE' }); var sjisArray = ENCODING.convert(unicodeArray, { to: 'SJIS', from : 'UNICODE' }); console.log("unicodeArray: " + ENCODING.detect(unicodeArray)); console.log("utf8Array: " + ENCODING.detect(utf8Array)); console.log("sjisArray: " + ENCODING.detect(sjisArray)); var unicodeStr = ENCODING.codeToString(unicodeArray); var utf8Str = ENCODING.codeToString(utf8Array); var sjisStr = ENCODING.codeToString(sjisArray); console.log("unicodeStr: " + unicodeStr); console.log("utf8Str: " + utf8Str); console.log("sjisStr: " + sjisStr); return sjisStr; }; console.log(encodeTo("あいうえお"));
$ node test.js unicodeArray: UNICODE utf8Array: UTF8 sjisArray: SJIS unicodeStr: あいうえお utf8Str: ã��ã��ã��ã��ã�� sjisStr: � �¢�¤�¦�¨ � �¢�¤�¦�¨

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

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

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

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

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

guest

回答2

0

ベストアンサー

ご質問の方法で、変換できているのではないでしょうか。
(HTTP応答はしたことがありませんが、テキストファイルの文字コード変換は試したことがあります)

NodeJS では 文字コード変換後のバイト配列(Buffer や ArrayBufferでも可)を
再度、文字列(string)として扱おうとすると、バイト配列が破壊された文字列になりました(NodeJS v6 時代)。
このため、変換の成否確認はバイト配列で行い、バイナリ保存した経験があります。


HTTP応答の直前に変換する方向で確認されてはどうでしょうか。

  1. HTMLなどのソース内でcharsetを指定すべき箇所は Shift_JIS に変換する(string)
  2. 応答直前に文字コード変換し、バイト配列を作成。
  3. Content-Length 用に バイト配列長を取得
  4. Content-Type に ; charset=Shift_JIS を付与。
  5. バイト配列を(ストリームなどで)HTTP応答

utf8 => Shift_JIS の文字コード変換:

  1. utf8など から Unicode の コードポイント を取得
  2. 対応する JIS X 0213 文字集合の 面、区、点の各番号(Unicodeにおけるコードポイントに相当)を取得
  3. 面区点番号を符号化表現(エンコーディング)のバイト配列にする

参考 :

EUC-JISX0213 / ISO-2022-JP-3 / Shift_JISX0213

Unicode(utf8など)

投稿2020/02/06 09:02

AkitoshiManabe

総合スコア5434

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

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

0

納期の関係もあり、出来ないことへの検証に時間をかけられないので
EC2で既存システムを動かす方向性にしました。

一応、未来の自分のために、私が試したSJIS変換のソースコードを全て以下に記します。
もし、SJIS変換をする良いやり方をご存知の方がいましたら、是非是非ご回答ください。
引き続き、お待ちしております。

javascript

1/** 2 * [使用中止] Convert Unicode String To Specified Encoding 3 * 色々な方法でUTF-8 -> SJIS変換を試したが全てうまくいかなかった 4 * そのため、ガラケー用ページの表示は Lambda@Edge では行わず 5 * EC2上のPHPで処理することにした 6 * 7 * @param string unicodeStr 8 * @param string toEncoding [optional] 9 * @return string 10 */ 11function encodeTo(unicodeStr, toEncoding = 'SJIS') 12{ 13 // 以下の方法は全てうまくいかなかったが、いつか必要になった時のためソースコードを残す 14 // 実行する場合は当該の node_modules をLambda@Edgeに置くこと 15 16 var availableEncodings = ['UTF16','UTF16BE','UTF16LE','JIS','UTF8','EUCJP','SJIS','UNICODE']; 17 if(availableEncodings.includes(toEncoding) === false){ 18 return false; 19 } 20 21 // 1. encoding.js を使う場合 22 var ENCODING = require('encoding-japanese'); 23 var arr = ENCODING.convert(ENCODING.stringToCode(unicodeStr), { to: toEncoding, from : 'UNICODE' }); 24 var str = ENCODING.codeToString(arr); 25 return str; 26 27 // 2. iconv-lite を使う場合 28 var ICONV = require('iconv-lite'); 29 var str = ICONV.decode(unicodeStr, toEncoding); 30 return str; 31 32 // 3. jconv を使う場合 33 var JCONV = require('jconv'); 34 var buffer = JCONV.convert(unicodeStr, 'UTF-8', toEncoding); 35 var str = JCONV.decode(buffer, toEncoding); 36 return str; 37 38 // 4. Lambda に標準搭載されている iconv を CUI で実行する場合(ローカル環境では実行不可) 39 // 以下のやり方を行う場合はこれを参照する関数全てに async/await をつけること 40 return new Promise((resolve, reject) => { 41 var FS = require('fs'); 42 var EXEC = require('child_process').exec; 43 44 var filePath = "/tmp/sjis"; 45 FS.writeFileSync(filePath, unicodeStr); 46 47 var cmd = 'iconv -f UTF-8 -t Shift_JIS ' + filePath; 48 49 var child = EXEC(cmd, (err, stdout, stderr) => { 50 if(err){ 51 reject(err); 52 } 53 else { 54 resolve(stdout); 55 } 56 }); 57 }); 58}; 59 60console.log(encodeTo("あいうえお", "SJIS"));

bash

1$ node test.js

投稿2020/02/05 02:53

qwe001

総合スコア133

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問