【问题标题】:HexDecode // HexEncodeHexDecode // 十六进制编码
【发布时间】:2019-11-22 17:23:37
【问题描述】:

问题是我尝试通过 HexDecode 和 HexEncode 将一个数组转换为另一个数组。一切都运行良好,直到我尝试转换两个字符,例如005002bb [Latin T'] 转换为一个字符,例如a760 [Ꝡ]。转换器工作,但它保留 ' (撇号),我想消失。我需要将 T' 视为一个单位并在输出中保留一个单位

我想我已经尝试了我所知道的一切

<script>
    String.prototype.hexDecode = function () 
    {
        var j;
        var hexes = this.match( /.{1,4}/g ) || [];
        var back = "";
        var lexesLength=hexes.length;
        for ( j = 0; j < lexesLength; j++ ) 
        {
            back += String.fromCharCode( parseInt( hexes[ j ], 16 ) );
        }

        return back;
    }   

    String.prototype.hexEncode = function () 
    {
        var hex, i;

        var result = [];
        var length = this.length;
        for ( i = 0; i < length; i++ ) 
        {
            hex = this.charCodeAt( i ).toString( 16 );
            result.push( ( "000" + hex ).slice( -4 ) );
        }

        return result;
    }

    Array.prototype.romanceltic = function () 
    {
        var roman = ['005402bb', '0041'];

        var celtic = ['a760', 'A762'];

        var length = this.length;
        var answer = '';
        var char;
        var index;
        for (var i = 0; i < length; i++) {
            char = this[ i ];
            index = roman.indexOf( char );
            answer += ( index != -1 ) ? celtic [ index ].hexDecode() : char.hexDecode();
        }
        return answer;
    }

    $(function() 
    {
        $( "input" ).click( function ( e ) 
        {
            var answer;
            var content = $("#input").val();
            switch ( $( this ).attr( "id" ) ) 
            {
                case "romanceltic":
                    {
                        answer = content.hexEncode().romanceltic();
                    }
                break;                      
            }
            $("#output" ).val(answer);
        } )
    } );

</script>

类似的东西

我没有错误消息。它有效,但输出不是我正在等待的。据我了解,代码不能将“005402bb”视为一个整体。 我想说输入是 T' ,输出是Ꝡ。换句话说,输入由两个字符(T+' 或任何其他 +')组成,而我想要得到的输出应该是一个字符(Ꝡ 或任何其他)。我还插入了完整的脚本和另一个字符 A -> Ꝣ [A762] 并且您可以看到代码正确转换它,但我不明白第一个示例会发生什么,为什么我不能将 T+' 转换为 Ꝡ ?

【问题讨论】:

  • 您能否展示给定输入的预期输出样本?另请注意,U+0054 是 T,而不是 P。
  • 没错,U+0054 就是 T。我想说输入是 T',输出是Ꝡ。换句话说,输入由两个字符(T+' 或任何其他 +')组成,而我想要得到的输出应该是一个字符(Ꝡ 或任何其他)。
  • 请编辑问题以包含此示例。理想情况下,您应该显示一些调用该函数的代码,显示如果它按预期工作会返回什么。
  • 我看不出这段代码是如何工作的——即使是你暗示你得到的部分结果——一个字符,int the var char 将如何匹配@中的编码字节987654324@数组?
  • 我插入了整个脚本,我用它来转换字符和脚本中的附加字母,以表明它适用于字符到字符的转换。

标签: javascript arrays unicode hex


【解决方案1】:

我已经阅读了代码,得出的结论是你把事情复杂化了。这似乎是一个穷人的输入法编辑器的实现。只需使用replace 方法即可。

var content = 'TʻA';
content = content.replace(/Tʻ/gu, 'Ꝡ');
content = content.replace(/A/gu, 'Ꝣ');
console.log(content);
// ꝠꝢ

【讨论】:

  • 非常感谢您的评论。你的选择当然更容易,我真的很感激。但是,我想明白,为什么上述代码不起作用,哪里出错了?(((
  • @Nikky,使用调试器。该错误位于index = roman.indexOf(char); 行中,其中char 是字符串0054,它不是roman 中的元素。真正的问题是您一次前进 1 个字符,而您应该查看输入数据的长度,然后决定相应地前进多少个字符。
  • 非常感谢。看来我比较笨。我必须使用 val().length 方法来确定它吗?如果不难,你能解释一下,我该如何改变它?
  • 关于替换方法,我试过了。例如 content = content.replace(/Tʻ/g, 'Tik').replace(/A/g, 'Ⴀk').replace(/P/g, 'Pik').replace(/Pʻ/g, '朴');但输出不像我等待的那样,例如它适用于 T`,但它不适用于 P`,在 P` 的情况下它返回带有撇号的 Pik。我知道也有 P,但我需要将带有撇号的 P 作为一个整体一起处理。我也尝试插入代码 T\ʻ,但效果不佳。
  • P等常见前缀的情况下,将最长的放在第一位,因此:… replace(/Pʻ/g, 'Pak').replace(/P/g, 'Pik') …替换链从左到右计算并且正则表达式尝试使用尽可能多的字符,这意味着 匹配两个字符并首先被替换,留下 P 进行下一次传递。
猜你喜欢
  • 2013-06-10
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 2023-01-29
  • 2020-06-15
  • 1970-01-01
  • 2011-12-09
  • 2012-06-26
相关资源
最近更新 更多