您的位置:首页 > 其它

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

2013-04-03 17:35 961 查看

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

在这篇文章(/article/9699902.html)中,说明了如何解决写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。(不过修改之前,也要进行文章/article/9699902.html中的操作)。

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。

搞定!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐