Устаревший код proc C/C++ с секционным символом (§)

Я поддерживаю устаревший код oracle proc C/C++, который обрабатывает текстовый файл и обновляет базу данных. В коде они готовят оператор SELECT, который выглядит примерно так

SELECT 'ERROR_ID=§' || ERROR_ID ||  '§'  || ' AND ' ...

и после выполнения оператора select они получают данные, как показано ниже, в массиве символов.

ERROR_ID=§ASI:10§ AND 

позже они заменяют разделительный символ (§) одинарными кавычками, как показано ниже.

if((char)file_str.arr[k]=='§')                    
{                                                 
    strncpy((char*)&file_str.arr[k],"'",1);         
} 

В основном они получают первичные ключи из БД (старый первичный ключ) и сравнивают первичный ключ, который присутствует в текстовом файле (новые ключи). Они используют простой strcmp для сравнения этих первичных ключей.

Теперь у меня возникает проблема. Несмотря на то, что старые и новые первичные ключи совпадают, если я посмотрю файл журнала, вместо одинарных кавычек появятся эти вопросительные знаки.

ERROR_ID=?ASI:10? AND FORM_ID=?064956?  - old key
ERROR_ID='ASI:10' AND FORM_ID='064956'  - new key

Я предполагаю, что, поскольку они используют sectional symbol(§) в коде, который является non ASCII char, он терпит неудачу.

Пожалуйста, предложите.

Обновление. Один и тот же двоичный файл развернут в разных средах. В некоторых средах разделительный символ (§) заменяется на '?' отметки, а на некоторых работает нормально. Вопрос. Существуют ли какие-либо параметры среды, влияющие на это? Если да, то что мне искать.

ОС во всех средах: SunOS 5.10


person NJMR    schedule 22.03.2018    source источник
comment
Покажите какой-нибудь минимально воспроизводимый пример, пожалуйста. Читайте также utf8everywhere.org   -  person Basile Starynkevitch    schedule 22.03.2018
comment
Это авария, ожидающая своего часа. Обратите внимание на кодировку текста, используемую вашим текстовым редактором. Если это не соответствует тому, что предполагает компилятор, то эти глифы, отличные от ascii, превращаются в вопросительные знаки.   -  person Hans Passant    schedule 22.03.2018
comment
Как выглядит исходный файл? UTF-8, UTF-16, Windows-1252?   -  person Martin Bonner supports Monica    schedule 22.03.2018
comment
Кроме того, почему приведение к char / char*. Почему не file_str.arr[k] = '\''; (а не strncpy)   -  person Martin Bonner supports Monica    schedule 22.03.2018
comment
... или std::replace(file_str.arr, file_str.arr+length, '§', '\'');, чтобы сделать все за один раз.   -  person Martin Bonner supports Monica    schedule 22.03.2018
comment
@HansPassant: Если текстовый редактор преобразует каждое вхождение § в ? знаки, то код должен заменить ? с '. Я не понимаю, в чем может быть проблема. Целевая система — UNIX, я перенес код в Visual Studio, но здесь я не могу воспроизвести проблему.   -  person NJMR    schedule 04.07.2018
comment
@HansPassant: я должен доказать, что эта ошибка возникает из-за того, что в исходном коде присутствует символ, отличный от ASCII. Я не могу это доказать.   -  person NJMR    schedule 04.07.2018
comment
Один и тот же двоичный файл развернут в разных средах. Означает ли это, что (1) одни и те же исходные файлы были скомпилированы для создания уникального двоичного файла, который был развернут в разных средах или (2) одни и те же исходные файлы были скомпилированы в разных средах для создания одного двоичного файла по средам, которые были развернуты в соответствующих средах?   -  person YSC    schedule 26.09.2018
comment
Я спрашиваю, потому что '§' – это многосимвольный литерал (на большинстве целевых ), имеет тип int и значение, определяемое реализацией.   -  person YSC    schedule 26.09.2018
comment
@YSC: Нет, уникальный двоичный файл развертывается в каждой среде. Мы компилируем код только в одной среде и развертываем тот же двоичный файл в других средах.   -  person NJMR    schedule 26.09.2018
comment
Полезны ли переменные C++ в файле cpp, определенные как специальные символы β?   -  person chux - Reinstate Monica    schedule 02.10.2018


Ответы (2)


Ваш исполняемый файл, вероятно, не устанавливает никакой локали. Таким образом, ваша программа работает с локалью, установленной средой. Я предлагаю установить локаль внутри вашего кода, например: setlocale(LC_ALL, "C"); прежде чем что-либо еще запустится.

person Markus Schumann    schedule 26.09.2018
comment
Это хороший комментарий. Также может быть, что на машинах установлены разные локали (вы можете проверить с помощью locale -a) - person Paul Floyd; 27.09.2018

Считаю подход неверным. я думаю, тебе следует

  1. Прочтите текстовый файл, переведя его в wchar_t и убедившись, что у вас правильный языковой стандарт для текстового файла. Будь то набор символов фиксированной ширины (кодовые страницы в байтах, UCS-2), многобайтовый набор символов (UTF-8, другие), вы получите набор символов фиксированной ширины в wchar_t.
  2. Создайте SQL как wstring. Теперь '§' должен исправляться независимо от входного файла.
  3. Выполните SQL.
person SJHowe    schedule 26.09.2018