Кто-нибудь знает, почему это произошло
const encoder = new TextEncoder()
const decoder = new TextDecoder()
const array = new Uint8Array([200])
console.info(encoder.encode(decoder.decode(array))) // prints [239, 191, 189]
Насколько я знаю, декодирование и кодирование чего-либо должны давать мне одно и то же значение. Разве он не должен просто напечатать [200] обратно?
Вы декодируете [200]
, которая является недопустимой последовательностью UTF-8 и приводит к �
const decoder = new TextDecoder()
const array = new Uint8Array([200])
console.info(decoder.decode(array)) // prints �
Поскольку двоичное представление 200
равно 11001000
, декодер считает, что это двухбайтовый символ UTF-8:
В кодировке UTF-8 байт, начинающийся со 110, указывает, что это первый байт двухбайтового закодированного символа.
Затем, когда вы пытаетесь закодировать, вы просто получаете следующий вывод [239, 191, 189]
или 0xEF 0xBF 0xBD
в шестнадцатеричном формате.
const encoder = new TextEncoder()
const array = new Uint8Array([])
console.info(encoder.encode("�"))
@bugwheels94 вам следует сначала использовать encoder.encode([200])
, возможно, вы работаете decode
, а затем encode
, а не наоборот. Если это не сработает, как насчет использования JSON.stringify
?
Хм, в этом случае .toString() также является более компактным решением, но я искал что-то сжатое, поскольку TextDecoder вызывает .toString добавляет запятую между значениями, поэтому немного увеличивается
@bugwheels94 отредактировал мой последний комментарий, но я думаю, что корень проблемы в том, что вы пытаетесь decode
перед encoding
, если вы перевернете их, все будет хорошо!
кодировщик, а затем декодер довольно умный. Однако он выдает результат точно так же, как родной .toString(). Спасибо за помощь!
@bugwheels94 вы хотите закодировать эти данные в другом формате. Наиболее распространенным для этой задачи является base64. См. stackoverflow.com/questions/9267899/…
@Kaiido, да, base64 тоже отличный вариант. Однако я обнаружил, что могу вставить типизированный массив в Redis напрямую, преобразовав его в буфер. поэтому решил использовать это. Но большое спасибо за совет!
о, классно! Спасибо за объяснение! Я хочу сохранить этот массив как строку в Redis, знаете ли вы, какой подход я должен использовать, пожалуйста?