带有分段符号的遗留过程 C/C++ 代码 (§)



我正在维护一个遗留的oracle proc C/C++代码,该代码正在处理文本文件并更新数据库。在代码中,他们正在准备一个看起来像这样的SELECT语句

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

在执行 select 语句后,他们将在 char 数组中获取如下所示的数据。

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

您的可执行文件可能没有设置任何区域设置。因此,您的程序使用环境设置的区域设置运行。我建议从代码内部设置语言环境,例如:setlocale(LC_ALL,"C"); 在其他任何事情运行之前。

我认为这种方法不正确。我认为你应该

  1. 阅读文本文件,转换为wchar_t确保文本文件的区域设置正确。无论是固定宽度字符集(以字节为单位的代码页,UCS-2),多字节字符集(UTF-8,其他),您最终都会得到wchar_t中的固定宽度字符集。
  2. 将 SQL 构造为 wstring。现在,无论输入文件如何,"§"都应该正确。
  3. 执行 SQL。

相关内容

  • 没有找到相关文章