从PHP echo char128及以上版本不起作用

问题描述

我有一个服务器端process.PHP脚本,该脚本回显了两个字符:

echo chr(127);
echo chr(128);

在客户端,我有一个Java脚本(以UTF-8编码在html页面中运行),该脚本已发布到PHP脚本并期望得到响应:

const xhr = new XMLHttpRequest();
// post xhr to PHP,check for DONE and 200,and get the response
console.log(xhr.responseText);       

对于127,我得到的响应是一个字符串,如预期的那样,一个字符代表127。 但是对于128及以上,它会给我3个字符,即-17,-65 -67。梳理并拖网,但一无所获。对于没有在线找到有关从服务器向客户端传输字节的任何信息感到非常惊讶。我是一名桌面C ++程序员,顺便说一句,这让我很困惑!

解决方法

由于要发送字节,因此需要停止考虑文本和字符。 JavaScript在内部是UTF-16,您将通过PHP从HTTP传输文本,从而设置其自己的编码。

如果要在JavaScript中解析raw bytes,则需要研究ArrayBuffer。收到数据后,您可以在其上编写一个DataView并获取字节。如果您仅使用8位,则也不必担心字节顺序。

        const xhr = new XMLHttpRequest();
        xhr
            .addEventListener(
                'load',() => {
                    const buffer = xhr.response;
                    const view = new DataView( buffer );
                    const byte = view.getUint8( 0 );
                    console.dir( byte );
                }
            );
        xhr.open( 'GET','/my/end-point' );
        xhr.responseType = 'arraybuffer';
        xhr.send();