Что нового

Коррекция вывода русских имён файлов с FTP

pvnn

Осваивающий
Сообщения
305
Репутация
32
У меня проблема с функцией _Encoding_UTF8ToUnicode_API

На XP подключаюсь к FTP Filezilla, т.к. он работает в юникоде, то русские имена файлов/каталогов выводятся крякозябрами. Функция _Encoding_UTF8ToUnicode_API вроде бы и возвращает русские названия, но как-то не совсем корректно, например вывод на экран:

Код:
MsgBox(0,'','Имя файла: '& _Encoding_UTF8ToUnicode_API($FileNAme)&@CRLF&'Размер: '&$Size)


Все что находится после _Encoding_UTF8ToUnicode_API игнорируется (на экран выводится только имя файла, само слово 'Размер' и значение не выводится). Однако если имя файла английское, то все нормально.

В чем может быть проблема?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
pvnn [?]
В чем может быть проблема?
В том что смешанные кодировки.
У MsgBox не только с этим проблемы:

Код:
MsgBox(64, 'Title', 1 = 1 & ' Test')


Можно конвертировать дополнительный текст в Unicode, хотя не вижу в этом смысла.
Хотелось бы посмотреть на полный пример (откуда берётся $FileName).
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
Кроме MsgBox, который не отображает корректно, как говорил до этого, выяснил, что и массив не заполняется корректно.
При чем опять же странно,
Код:
$aArray[$i][0]=_Encoding_UTF8ToUnicode_API($FileNAme)
удачно заполняется, а вот следующая колонка не заполняется
Код:
$aArray[$i][1]=$Size



Вот полный код:

Код:
; Подключаем необходимые библиотеки
#include <Encoding.au3>
#include <FTPEx.au3>    
#include <Array.au3>    
#Include <String.au3>   


; Данные подключения
$server = '172.*.*.*'
$port = 8021
$username = 'admin'
$pass = '***'

; Подключение к FTP
$Open = _FTP_Open('MyFTP Control')
$Conn = _FTP_Connect($Open, $server, $username, $pass,0,$port)

; Чтение всех файлов директории в Массив
  $aFile = _FTP_ListToArray2D($Conn, 0)
  _ArrayDisplay($aFile)  ; Просмотр
; Создаем новый массив, в который будем добавлять записи с правильной кодировкой
  $KolRow=$aFile[0][0]+1
  Local $aArray[$KolRow][2]

For $i=1 to $aFile[0][0]
	; Имя
	$FileNAme=$aFile[$i][0] 						; Имя файла/каталога
	$NewName=_Encoding_UTF8ToUnicode_API($FileNAme) ; Конвертируем в правильную кодировку
	; Размер
	$Size=$aFile[$i][1]
	; Заполняем новый массив
    $aArray[$i][0]=$NewName
	$aArray[$i][1]=$Size
    ; MsgBox(0,'','Было: '&$FileNAme&@CRLF&'Стало: '& _Encoding_UTF8ToUnicode_API($FileNAme)&@CRLF&'Размер: '&$Size)

Next
_ArrayDisplay($aArray) ; Просмотр
$Ftpc = _FTP_Close($Open)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
pvnn [?]
Я не могу проверить его.
Помести в файл то что возвращает _FTP_ListToArray2D, в виде [0]|[1].

следующая колонка не заполняется
Проверять нужно отдельно, а не вместе с конвертированием строки.

Код:
MsgBox(0, '', 'Имя файла: ' & _Encoding_UTF8ToUnicode_API($FileNAme))
MsgBox(0, '', 'Размер: ' & $Size)
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
Попробовал
Код:
MsgBox(0, '', 'Имя файла: ' & _Encoding_UTF8ToUnicode_API($FileNAme))
MsgBox(0, '', 'Размер: ' & $Size)

...да, так работает
А как быть с массивом? Не получается добавить в один массив Название файла и размер файла после _Encoding_UTF8ToUnicode_API.
Примеры того, что я получаю с FTP и результат конвертирования привожу во вложениях.

...Видно что размер файла добавляется только там, где небыл перевод кодировки
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
pvnn,
Попробуйте вместо _Encoding_UTF8ToUnicode_API() использовать _Encoding_UTF8ToANSI_API().
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
pvnn [?]
Попробовал, получилась обратная ситуация
Чтобы не гадать, выведи это всё в файл, вот так:

Код:
...

$aFile = _FTP_ListToArray2D($Conn, 0)

$hFile = FileOpen(@ScriptDir & '\Debug.txt', 2)

For $i = 1 To $aFile[0][0]
    FileWriteLine($hFile, $aFile[$i][0] & '|' & $aFile[$i][1])
Next

FileClose($hFile)


в папке со скриптом появится файл Debug.txt, прикрепи этот файл к сообщению.


Добавлено:
Сообщение автоматически объединено:

А если так:

Код:
For $i = 1 To $aFile[0][0]
	$sFileName = $aFile[$i][0]
	
	If _Encoding_IsUTF8Format($sFileName) Then
		$sFileName = _Encoding_UTF8ToANSI($sFileName)
	EndIf
	
	$aArray[$i][0] = $sFileName
	$aArray[$i][1] = $aFile[$i][1]
Next

_ArrayDisplay($aArray) ; Просмотр


?
:scratch:
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32


Код:
For $i = 1 To $aFile[0][0]
    $sFileName = $aFile[$i][0]
    
    If _Encoding_IsUTF8Format($sFileName) Then
        $sFileName = _Encoding_UTF8ToANSI($sFileName)
    EndIf
    
    $aArray[$i][0] = $sFileName
    $aArray[$i][1] = $aFile[$i][1]
Next

_ArrayDisplay($aArray) ; Просмотр


Так заработало!!! Получается нужна обязательная проверка
Код:
If _Encoding_IsUTF8Format($sFileName)

Спасибо большое за помощь в решении проблемы

П.С. Файлик Debug.txt прикреплять не буду... проверил, туда данные заносятся корректно
 
Верх