GDAL读写dxf文件中文乱码问题解决方法(二)

1 写DXF中文乱码问题解决方法

在这篇文章(http://blog.csdn.net/zhouschina/article/details/8701503)中,说明了如何解决写DXF文件中文乱码问题,但是有时会引起DXF文件使用AutoCAD打不开,提示:

DXF 读取错误 第 141003 行。

DXF 输入无效或不完整 -- 图形被放弃。

使用记事本打开dxf文件会发现,转码发生错误:

中国  两个汉字转为了 謀U+0439? 后面多了 ?

要解决问题,于是读取其源码,发现在ogrdxfwritelayer.cpp文件中,WriteTEXT()函数中,代码第484-489行,有如下代码:

/* -------------------------------------------------------------------- */
/*      Escape the text, and convert to ISO8859.                        */
/* -------------------------------------------------------------------- */

        const char *pszText = poLabel->TextString( bDefault );

        if( pszText != NULL && !bDefault )
        {
            CPLString osEscaped = TextEscape( pszText );
            WriteValue( 1, osEscaped );
        }

 在写注记值的时候,进行了TextEscape处理,将字符串转为了ISO8859,既然我们使用的是中文版cad,中文版系统,干脆注释掉TextEscape,修改代码如下:

/* -------------------------------------------------------------------- */
/*      Escape the text, and convert to ISO8859.                        */
/* -------------------------------------------------------------------- */
        const char *pszText = poLabel->TextString( bDefault );

        if( pszText != NULL && !bDefault )
        {
           // CPLString osEscaped = TextEscape( pszText );
            WriteValue( 1, pszText );
        }

重新编译GDAL1.9.2。(不过修改之前,也要进行文章http://blog.csdn.net/zhouschina/article/details/8701503中的操作)。

2 读DXF中文乱码问题解决方法

下面我们解决读dxf出现的中文乱码问题:

读文件出现中文乱码,也是GDAL/OGR内部进行了转码。我们查看ogrdxflayer.cpp中,读取注记的函数TranslateMTEXT()和TranslateTEXT()函数,在TranslateMTEXT()中,也就是cpp文件中第449-454行代码,如下:

	    case 1:
            case 3:
            if( osText != "" )
                osText += "\n";
            osText += TextUnescape(szLineBuf);
            break;

可以看到也进行了转码,TextUnescape函数将ISO8859转为UTF8编码。我们修改代码为:

	    case 1:
            case 3:
            if( osText != "" )
                osText += "\n";
            osText += CPLString (szLineBuf);
            break;


 在TranslateTEXT()函数中,第638-645行代码,如下:

/* -------------------------------------------------------------------- */
/*      Translate text from Win-1252 to UTF8.  We approximate this      */
/*      by treating Win-1252 as Latin-1.                                */
/* -------------------------------------------------------------------- */
    osText.Recode( poDS->GetEncoding(), CPL_ENC_UTF8 );

    poFeature->SetField( "Text", osText );

 修改如下:

/* -------------------------------------------------------------------- */
/*      Translate text from Win-1252 to UTF8.  We approximate this      */
/*      by treating Win-1252 as Latin-1.                                */
/* -------------------------------------------------------------------- */
    //osText.Recode( poDS->GetEncoding(), CPL_ENC_UTF8 );

    poFeature->SetField( "Text", osText );


重新编译GDAL1.9.2。

 

搞定!

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值