Потребление остальных API из Oracle PLSQL возвращается ??? для арабских персонажей

Фон

Объект JavaScript Date JavaScript отслеживает время в UTC внутренне, но обычно принимает вход и выход в локальное время компьютера, на котором он запущен. У этого нет никаких средств для работы со временем в других часовых поясах. Вы можете анализировать и выводить даты, которые являются UTC или Local, но вы не можете напрямую работать с другими часовыми поясами.

Чтобы быть абсолютно точным, внутреннее представление объекта Date - это единственное число, представляя количество миллисекунд, прошедших с момента 1970-01-01 00:00:00 UTC, независимо от секунд прыжка. В объекте Date нет часового пояса или строкового формата. Когда используются различные функции объекта Date, локальный часовой пояс компьютера применяется к внутреннему представлению. Если функция выдает строку, тогда локальная информация компьютера может быть принята во внимание, чтобы определить, как создать эту строку. Информация зависит от каждой функции, а некоторые из них специфичны для реализации.

Библиотеки

К счастью, есть библиотеки, которые могут это сделать. Они реализуют стандартную базу данных о часовых поясах Olson / IANA в JavaScript. У некоторых есть накладные расходы, если вы работаете в веб-браузере, так как база данных может быть немного большой, если вы хотите все это. К счастью, многие из этих библиотек позволяют выборочно выбирать зоны, которые вы хотите поддерживать, делая размер данных более приемлемым. Некоторые из них используют современные функции для получения данных о часовых поясах из API Intl, а не для их отправки.

Для этого есть несколько библиотек:

Luxon, вероятно, является самой безопасной ставкой для всего современного использования и является самым легким весом, поскольку он использует API Intl для его данные о часовом поясе.

Момент-часовой пояс является расширением moment.js и приводит к его собственным данным часового пояса.

js-joda - это JavaScript реализация Joda-Time API (с Java) и включает поддержку часового пояса через отдельный модуль.

BigEasy / TimeZone также находится на правильном пути.

WallTime- js достиг конца жизни , а владельцы мигрируют в момент-время.

TimeZoneJS был вокруг самого длинного, но, как известно, имеют некоторые давние ошибки, особенно при переходах на летнее время. Надеюсь, они будут исправлены в какой-то момент в будущем.

tz.js также существует некоторое время, но не очень хорошо документировано, IMHO.

Вы должны оценить эти библиотеки, чтобы увидеть, что будет отвечать вашим потребностям. Если вы не уверены, перейдите с моментом / моментом-временем.

Встроенная поддержка в современных браузерах

Если вы можете ограничить свое использование в современных веб-браузерах, теперь вы можете сделать следующее без каких-либо специальных Библиотеки:

new Date().toLocaleString("en-US", {timeZone: "America/New_York"})

Это не комплексное решение, но оно работает для многих сценариев, которые требуют только преобразования вывода (от UTC или местного времени до определенного часового пояса, но не в другом направлении). Это часть API интернационализации ECMAScript (ECMA-402). Подробнее см. В этой записи . Эта таблица совместимости отслеживает, какие версии поддерживаются. Это API Intl, упомянутый выше, что некоторые библиотеки теперь используют внутренне.

0
задан H.Al 17 January 2019 в 08:59
поделиться

1 ответ

Попробуйте вставить этот код:

Charset VARCHAR2(20);

BEGIN

    SELECT UTL_I18N.MAP_CHARSET(VALUE)
    INTO Charset
    FROM nls_database_parameters
    WHERE parameter = 'NLS_CHARACTERSET';

UTL_HTTP.set_header(v_request, 'Content-Type', 'text/html; charset='||Charset);

Я не знаком с REST, я не знаю, требуется ли и правильная text/html;.

Обновление

Я просто вижу набор символов вашей базы данных AR8ASMO8X, который не имеет никакого имени IANA (по крайней мере, не в соответствии с Oracle UTL_I18N.MAP_CHARSET)

[1111 ] В этом случае попробуйте

UTL_HTTP.set_header(v_request, 'Content-Type', 'text/html; charset=UTF-8');
UTL_HTTP.begin_request(CONVERT(v_url,'AL32UTF8'));

Скорее всего, сервер вернет ответ в UTF-8 - будет наиболее распространенным, в противном случае проверьте заголовок ответа.

Тогда попробуйте это:

UTL_HTTP.SET_BODY_CHARSET(v_response, 'AL32UTF8');

Помимо всего вышеперечисленного, у вас также может быть проблема display , то есть внутри Oracle все будет хорошо, просто ваш клиент не может отобразить правильные символы см. в . OdbcConnection возвращает китайские иероглифы как «?»

.
0
ответ дан Wernfried Domscheit 17 January 2019 в 08:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: