找回密码
 加入
搜索
查看: 3377|回复: 11

新版如何解决这个排序乱码问题

  [复制链接]
发表于 2008-9-8 17:55:21 | 显示全部楼层 |阅读模式
点击“机器名|日期|状态”可使现表格按列排序,但中文的话会出现乱码,而旧版本可以使用ANS编码,新版去掉了这个编码。那新版还有其它办法解决这个问题吗?
#include <GUIConstants.au3>;gui
#include <GuiListView.au3>
#Region ### START Koda GUI section ### Form=
        $Form1 = GUICreate("日志查看", 555, 392, 193, 125)
        $listview1 = GUICtrlCreateListView("机器名|日期|状态", 16, 16, 521, 337)
        GUICtrlSendMsg($listview1, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES);表格边框
        GUICtrlSendMsg($listview1, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT)
        GUISetState(@SW_SHOW)
        #EndRegion ### END Koda GUI section ###
        $item1 = GUICtrlCreateListViewItem("auto1|中文|123456", $listview1)
        $item2 = GUICtrlCreateListViewItem("auto2|中文|123456", $listview1)
        $item3 = GUICtrlCreateListViewItem("auto3|中文|123456", $listview1)
        While 1
                $msg = GUIGetMsg()
                If $msg = $GUI_EVENT_CLOSE Then ExitLoop
                If $msg = $listview1 Then;以下两行为行排序
                Dim $B_DESCENDING[_GUICtrlListView_GetColumnCount ($listview1) ]
                _GUICtrlListView_SimpleSort ($listview1, $B_DESCENDING, GUICtrlGetState($listview1))
                EndIf
        WEnd

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2008-9-8 18:30:14 | 显示全部楼层
有。。。新版可以将中文加空白字符串即可。个人测试得来的经验。。。

例如:

$text="中文               "

空格应该放多少,自己测试。
 楼主| 发表于 2008-9-8 18:44:08 | 显示全部楼层
原帖由 sanhen 于 2008-9-8 18:30 发表
有。。。新版可以将中文加空白字符串即可。个人测试得来的经验。。。

例如:

$text="中文               "

空格应该放多少,自己测试。

谢谢,这是什么原理,摸不着和尚。
发表于 2008-9-8 20:32:56 | 显示全部楼层
原理这方面我也搞不懂,很多问题我都是摸着石头过河摸出来的。
发表于 2008-9-8 20:59:29 | 显示全部楼层
bug来的,看这里:
函数:_GUICtrlListView_SetItemText

$iBuffer = StringLen($sText) + 1
$tBuffer = DllStructCreate("char Text[" & $iBuffer & "]")

我想大家都明白中文和英文的不同吧?
发表于 2008-9-8 21:00:13 | 显示全部楼层
这样,缓冲区就太小了,结果出事了。
 楼主| 发表于 2008-9-8 22:27:26 | 显示全部楼层
原帖由 asdf 于 2008-9-8 20:59 发表
bug来的,看这里:
函数:_GUICtrlListView_SetItemText

$iBuffer = StringLen($sText) + 1
$tBuffer = DllStructCreate("char Text[" & $iBuffer & "]")

我想大家都明白中文和英文的不同吧?

这两句中,中英文有什么不同?再次请教,这里的缓冲区是怎么回事?谢谢。
发表于 2008-9-8 22:33:21 | 显示全部楼层
中文字符占用的字节要比英文多,所以strlen返回的长度不够容纳我们的中文。
        $iBuffer = StringLen($sText) + 1
        $tBuffer = DllStructCreate("char Text[" & $iBuffer & "]")
                      ……
        DllStructSetData($tBuffer, "Text", $sText)
在这里取出结构里的text,可以看到中文字符被截断了。
 楼主| 发表于 2008-9-8 22:33:39 | 显示全部楼层
难道将

$tBuffer = DllStructCreate("char Text[" & $iBuffer & "]")

改成:
$tBuffer = DllStructCreate("wchar Text[" & $iBuffer & "]") 就行了?
 楼主| 发表于 2008-9-8 22:39:17 | 显示全部楼层
首先谢谢asdf的解答,
我对DllStructCreate ( "Struct" [,Pointer] )这个函数都不了解,因为这个函数没有汉化。
如果你有时间,希望解答一下这个函数的作用,谢谢。

但我看到这里
char 8bit(1byte) ASCII char
wchar 16bit(2byte) Wide char
2byte才能容纳下一个汉字。所以,我觉得问题可能出现在这里。

所以就有了我9楼的疑问:
“难道将
$tBuffer = DllStructCreate("char Text[" & $iBuffer & "]")
改成:
$tBuffer = DllStructCreate("wchar Text[" & $iBuffer & "]") 就行了?”

当我看到你8楼,我又疑惑了:

“所以strlen返回的长度不够容纳我们的中文。
$iBuffer = StringLen($sText) + 1”

StringLen 函数用于,返回指定字符串的字符总数.这个函数并没有限制字符多少啊?后面的+1是什么意思呢?
发表于 2008-9-8 22:40:42 | 显示全部楼层
$tBuffer = DllStructCreate("Wchar Text[" & $iBuffer & "]")
        $iResult = _SendMessage($hWnd, $LVM_SETITEMW, 0, $pMemory, 0, "wparam", "ptr")

修正这3行即可。
发表于 2008-9-8 22:42:10 | 显示全部楼层
+1是因为空字符是字符串的结尾,留1给这个空字符。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-9-23 13:23 , Processed in 0.084967 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表