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。

 

搞定!

 

你可能感兴趣的:(C++,GDAL,DXF)