log4cxx中文输出错误补丁

log4cxx中文输出错误补丁

(金庆的专栏)

已提交Bug:https://issues.apache.org/jira/browse/LOGCXX-399

log4cxx_0.10.0及主干代码,Windows下输出中文,发现有多余输出。

void main()
{
    setlocale(LC_ALL, "");
    LOG4CXX_INFO(pLog, "一二");  // log 2 chinese characters.
}


输出为:一二二。

错误在 MbstowcsCharsetDecoder::decode().

   size_t converted = mbsrtowcs(...
   if (converted == (size_t) -1) {
       ...
   } else {
       stat = append(out, buf);
       in.position(in.position() + converted);  // ERROR!
   }

mbsrtowcs()返回的是汉字的字数,而输入缓冲区in的position是按字节计数的,
对于汉字,position应该增加2*converted,而不是converted.
因为position少增加了一半,所以后半部分字符串会重复解码。

可如下更改:

   if (converted == (size_t) -1) {
       ...
   } else {
       stat = append(out, buf);
       // in.position(in.position() + converted);  // ERROR!
       if (src)
           in.position(src - in.data());
       else  // mbsrtowcs() set src to NULL.
           in.position(in.position() + strnlen(in.current(), in.remaining()));
   }


此处的in是个二进制块,其中可能会有0,而mbsrtowcs()的输入应该是0结尾的字符串。
碰到0时,mbsrtowcs()认为已经成功转换到串尾,并将src重设为NULL。
代码中已经有对0的处理。

有可能mbsrtowcs()会越过输入缓冲区的尾部一直读取,最多为256字节,仍有可能出现垃圾字符。
但是现在的std::string实现有0结尾,所有才没有出错。若要更正这个错误,就需要在输入缓冲区尾部添0。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值