

JavaScriptで日本語のシフトが出来なかったため、質問した次第です。

下記のコードで英語の大小文字はできたのですが、`function(c)` 内で日本語(平仮名･片仮名･漢字)も同時にする方法を模索しております。

[code]

    return decryptee.replace(/[a-zA-Z]/g, function (c) {
        return String.fromCharCode((c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) ? c : c - 26);
    });
    
[/code]

下記のコードで実行ができるかと思ったのですが、出来ませんでした。(下記コードは平仮名のみ)

[code]

    if (/[a-zA-Z]/g.test(decryptee)) {
        return decryptee.replace(/[a-zA-Z]/g, function (c) {
            return String.fromCharCode((c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) ? c : c - 26);
        });
    }else if (/[ぁ-ん]/g.test(decryptee)) {
        return decryptee.replace(/[ぁ-ん]/g, function (c) {
            return String.fromCharCode((c.charCodeAt(0) <= 12426 ? 12426 : 12438) >= (c = .charCodeAt(0) + 13) ? c : c - 85);
       });
    }
    
[/code]

もし、解決方法、参考文献等ご存知の方がおられましたらお教えいただけると嬉しいです。

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

* * *

**追記:(2020/06/18 14:30)**  
コードの修正と不明点の明確化を行います。  
比較時の代入に関して以下の様に変更しました。

[code]

        var s = c.charCodeAt(0);
            return String.fromCharCode((s <= 90 ? 90 : 122) >= (s + 13) ? s + 13 : s - 13);
    
[/code]

**不明点**

  * 英文和文の同時置換もしくは日本語の後に英文の置換を行う方法
  * サロゲートペアの置換を行う方法

の2点に関してお聞きしたく思います。

処理に関しての実行部分の抜粋です。

[code]

    var anomalyDict = [
      {
        title: "cube",
        first: "<oybpxdhbgr pynff='gvzre'><c><o>6聞易楠もぬよルィソカし<fcna pynff='ernq'>屯ゐ</fcna>めねそ</o></c><c pynff='gvzre'>06:00</c></oybpxdhbgr>"
       //本来は、この後にsecond,thirdがあり、contentも複数あるのですが、省略します。
      },
    ];
    var constant = [
        "aaa",
        "bbb",
        "ccc",
        "</c><c>"
    ];
    var anomalies = [];
    for(let a = 0; a < anomalyDict.length; a++) {
        anomalies[a] = [
         anomalyDict[a]['first'],
         constant[3],
         constant[0],
         constant[3],
        ].join("");
    }
    var decrypt = function (decryptee) {
        console.log("Decrypting...");
        return decryptee.replace(/[a-zA-Z]/g, function (c) {
        var s = c.charCodeAt(0);
            return String.fromCharCode((s <= 90 ? 90 : 122) >= (s + 13) ? s + 13 : s - 13);
        });
    };
     decryptedAnomaly = decrypt(anomalies[anomaly]);
    
[/code]

* * *

**追記:(2020/06/18 19:10)**  
処理に関して、

[code]

    //Rot13 decode
    var decrypt = function (decryptee) {
        console.log("Decrypting...");
        return decryptee.replace(/[a-zA-Z]/g, function (c) {
            var s = c.charCodeAt(0);
            return String.fromCharCode((s <= 90 ? 90 : 122) >= (s + 13) ? s + 13 : s - 13);
        }).replace(/[ぁ-ん]/g, function (c) {
            var s = c.charCodeAt(0);
            return String.fromCharCode(s <= 12425 ? s - 13 : s - 73);
        });
    };
    
[/code]

とすることで、現状のコードでは平仮名と英語を同時に置換することができました。  
同様にして、カタカナ、漢字を置換しようと考えています。

不明点2の

  * サロゲートペアの置換を行う方法

のみお聞きしたく思います。  
よろしくお願いいたします。


CC BY-SA 4.0
2020-06-17T18:36:36.420
67765
2020-06-18T10:21:31.693
2020-06-18T10:21:31.693
37812
37812
question
javascript
JavaScriptでCaesar暗号を日英混合の文字列で使用する方法


おそらく、テストする文字列にアルファベットと日本語の混じったものを使用されているのではないでしょうか。この場合アルファベット部分の置換を行った時点で
return してしまうので平仮名の置換は行われません。

それ以外の弱い問題点として、比較を行う際に代入を行っているのが気になります。JavaScript (ECMAScript)
では[演算子の引数の評価の順番が決まってはいる](https://stackoverflow.com/a/8406177/5989200)のですが、このことに依存したコードを書くのはバグの温床になりがちです。ショートコーディングをしたいのでない限り避けるべきです。

また、今後この処理を漢字全体にも拡張していくのであれば、漢字における「n 文字後」をどう定義するのかを考えなければいけないかもしれません。漢字には
UTF-16 の charCode ひとつでは表せないものが存在します（サロゲートペア）。もちろんそのような文字を扱わないことにするのは自由です。


CC BY-SA 4.0
2020-06-17T22:58:46.373
67767
2020-06-17T22:58:46.373
19110
67765
answer