Fix encoding problem of ping result for non-English Windows

This commit is contained in:
Louis Lam
2021-10-14 00:22:49 +08:00
parent 9b05e86c25
commit e2dbacb383
4 changed files with 124 additions and 10 deletions

View File

@@ -4,6 +4,8 @@ const net = require("net");
const spawn = require("child_process").spawn;
const events = require("events");
const fs = require("fs");
const util = require("./util-server");
const WIN = /^win/.test(process.platform);
const LIN = /^linux/.test(process.platform);
const MAC = /^darwin/.test(process.platform);
@@ -101,6 +103,9 @@ Ping.prototype.send = function (callback) {
});
this._ping.stdout.on("data", function (data) { // log stdout
if (WIN) {
data = convertOutput(data);
}
this._stdout = (this._stdout || "") + data;
});
@@ -112,6 +117,9 @@ Ping.prototype.send = function (callback) {
});
this._ping.stderr.on("data", function (data) { // log stderr
if (WIN) {
data = convertOutput(data);
}
this._stderr = (this._stderr || "") + data;
});
@@ -157,3 +165,19 @@ Ping.prototype.start = function (callback) {
Ping.prototype.stop = function () {
clearInterval(this._i);
};
/**
* Try to convert to UTF-8 for Windows, as the ping's output on Windows is not UTF-8 and could be in other languages
* Thank @pemassi
* https://github.com/louislam/uptime-kuma/issues/570#issuecomment-941984094
* @param data
* @returns {string}
*/
function convertOutput(data) {
if (WIN) {
if (data) {
return util.convertToUTF8(data);
}
}
return data;
}

View File

@@ -6,6 +6,8 @@ const passwordHash = require("./password-hash");
const dayjs = require("dayjs");
const { Resolver } = require("dns");
const child_process = require("child_process");
const iconv = require("iconv-lite");
const chardet = require("chardet");
/**
* Init or reset JWT secret
@@ -312,3 +314,14 @@ exports.startUnitTest = async () => {
process.exit(code);
});
};
/**
* @param body : Buffer
* @returns {string}
*/
exports.convertToUTF8 = (body) => {
const guessEncoding = chardet.detect(body);
debug("Guess Encoding: " + guessEncoding);
const str = iconv.decode(body, guessEncoding);
return str.toString();
};