powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / как перекодировать имя файла
18 сообщений из 18, страница 1 из 1
как перекодировать имя файла
    #34862796
andron123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!

Есть веб-приложение, IIS, VbScript, dll (на VB). Кодировка страниц - utf-8. Сервера, на которых данное приложение работает, могут быть на любых языках (помимо ru и eng).
Загружается файл из браузера на сервер на любом языке, имя его также передается в utf-8, на сервере соответственно он не может быть сохранен, т.к. пытается быть сохраненным с именем в кодировке utf-8.
Вопрос - что делать?
Очевидно, надо каждое имя файла перекодировать под соответствующую кодировку, установленную на сервере. Вопрос - чем? Желательно пример кода на VB или VBScript/
Не самому же с нуля писать перекодировщик с utf-8 на всевозможные языки...

Уверен, что решение есть, только найти его не просто оказалось. Может кто сталкивался.

Спасибо.
...
Рейтинг: 0 / 0
как перекодировать имя файла
    #34862845
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StrConv не подойдет?


I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
как перекодировать имя файла
    #34862873
andron123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как-то с ней не получается в локальной кодировке результат увидеть...
Может api какой-то есть?
...
Рейтинг: 0 / 0
как перекодировать имя файла
    #34863219
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть что-то типа Wide2Char
Это из серии Oem2Char, Char2Oem

ЗЫЖ StrConv делает тоже самое

I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
как перекодировать имя файла
    #34863850
SoftParanoik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не совсем понятен вопрос.
Например, загружаем файл с какой-нибудь арабской машины, где он называется بغفجכس (по арабски - "Отчеты"), на сервер, где локализация английская. И что мы должны в итоге получить?
...
Рейтинг: 0 / 0
как перекодировать имя файла
    #34864289
andron123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изучив msdn пришел к выводу, что нужен работающий пример на VB с ипользованием WideCharToMultiByte. Есть такое?

С арабским интерестный пример :)
Пока могу сказать, как это получается с русскими именами.
Все старницы в utf-8, берем файл "мой документ.doc" и грузим его на сервер через upload формы. На сервере папка, которая примет этот файл, но с оригинальным именем, например получится должно C:\DownloadedFiles\мой документ.doc.
А загружается же он вот с таким именем "РјРѕР№ документ.doc". И сервер его не очень то хочет в таком виде принимать.
...
Рейтинг: 0 / 0
как перекодировать имя файла
    #34864909
andron123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел такой пример.
Теперь не могу найти цифровой код кодировки utf-8, он вообще есть?

Преобразование строки из одной кодировки в другую

Option Explicit

'===================Перекодировка символов===========
Public Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, _
ByVal lpWideCharStr As String, ByVal cchWideChar As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, ByVal lpDefaultChar As String, ByVal lpUsedDefaultChar As Long) As Long
Public Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, ByVal lpWideCharStr As String, ByVal cchWideChar As Long) As Long

Public Const MB_PRECOMPOSED = &H1 ' use precomposed chars

'=============Функция перекодировки===================
Public Function Convert(ByVal strSrc As String, ByVal nFromCP As Long, ByVal nToCP As Long) As String
Dim nLen As Long
Dim strDst As String
Dim strRet As String
Dim nRet As Long
nLen = Len(strSrc)
strDst = String(nLen * 2, Chr(0))
strRet = String(nLen * 2, Chr(0))
nRet = MultiByteToWideChar(nFromCP, MB_PRECOMPOSED, strSrc, nLen, strDst, nLen)
nRet = WideCharToMultiByte(nToCP, 0, strDst, nRet, strRet, nLen * 2, ByVal 0, 0)
Convert = Left(strRet, nRet)
End Function

Пример
Имеем, допустим, TextBox. В нем текст в кодировке KOI, надо получить в Windows. Запускаешь:
TextBox = StringConvert(TextBox, 20866, 1251)

Значения для часто используемых кодировок:
Central European (DOS) 852
Central European Alphabet (Windows) 1250
Central European Alphabet (ISO) 28592
Cyrillic Alphabet (DOS) 866
Cyrillic Alphabet (Windows) 1251
Cyrillic Alphabet (ISO) 28595
Cyrillic Alphabet (KOI8-R) 20866
Ukrainian Alphabet (KOI8-RU) 21866
Latin 3 Alphabet (ISO) 28593
Western Alphabet 1252
Baltic Alphabet (Windows) 1257
Baltic Alphabet (ISO) 28594
Greek Alphabet (Windows) 1253
Greek Alphabet (ISO) 28597
Turkish Alphabet 1254
Arabic Alphabet (Windows) 1256
Arabic Alphabet (ISO) 28596
Hebrew (DOS) 862
Hebrew Alphabet (Windows) 1255
...
Рейтинг: 0 / 0
как перекодировать имя файла
    #34864993
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CP_UTF8

Код: plaintext
Const CP_UTF8 =  65001 

вот здесь посмотрите

I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
как перекодировать имя файла
    #34865001
SoftParanoik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй 65001
...
Рейтинг: 0 / 0
как перекодировать имя файла
    #34865448
AndreyMp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как пробовал с StrConv, вроде как раз для этого и придумана (и не только конечно)
Код: plaintext
st1=strconv(st_in,vbFromUnicode)
...
Рейтинг: 0 / 0
как перекодировать имя файла
    #34865541
andron123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за советы, буду пробовать.

А с strconv делаю вот так:
st_in="мой документ.doc"
st1 = CStr(strconv(st_in,vbFromUnicode))
Out st1

или вот так:
st_in="мой документ.doc"
st1 = strconv(st_in,vbFromUnicode)
Out st1

результат одинаков
800a000d|Type_mismatch:_'strconv'

Или тут какое-то хитрое преобразование надо применить?
...
Рейтинг: 0 / 0
как перекодировать имя файла
    #34865548
фихня!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
писать латиницей и не будет проблем. при желании на выходе переделывать обратно
...
Рейтинг: 0 / 0
как перекодировать имя файла
    #34865622
andron123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да, пожалуй это единственый способ писать латиницей, только в оригинальный язык в и из мнемонического вида придедтся преобразовывать какждый раз.
...
Рейтинг: 0 / 0
как перекодировать имя файла
    #34866765
andron123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос навстречу.
По сути мне надо иметь возможность только три языка поддерживать - русский, английский и болгарский. Файлы загружаться будут на сервер с английской windows, имена файлов как на русском и английском, так и на болгарском (клиенты разноязычные и имена файлов у них разноязычные).
Вот каким образом мне переводить в латиницу русские и болгарские буквы? Писать под каждый язык свой мнемонический траслитор? Чтобы работала обработка вида мои документы.doc = moi dokumenty.doc? Но если с русского на англ. еще куда ни шло, то с болгарского на англ. проблемнее перевести. А потом будут добавляться другие языки и получается надо под каждый язык писать мнемонический переводчик?

А можно ли на одном windows english сервере хранить имена файлов на трех языках? :) на бред похоже но все-же может есть идеи...
Какие еще могут быть варианты?

Спасибо.
...
Рейтинг: 0 / 0
как перекодировать имя файла
    #34869852
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron123А можно ли на одном windows english сервере хранить имена файлов на трех языках? :)Конечно можно и даже более того, только так и нужно.
Переходи на unicode в именовании файлов и все проблемы исчезнут.
...
Рейтинг: 0 / 0
как перекодировать имя файла
    #34956340
Belkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron123Нашел такой пример.
Теперь не могу найти цифровой код кодировки utf-8, он вообще есть?

Преобразование строки из одной кодировки в другую

Option Explicit

'===================Перекодировка символов===========
Public Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, _
ByVal lpWideCharStr As String, ByVal cchWideChar As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, ByVal lpDefaultChar As String, ByVal lpUsedDefaultChar As Long) As Long
Public Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, ByVal lpWideCharStr As String, ByVal cchWideChar As Long) As Long

Public Const MB_PRECOMPOSED = &H1 ' use precomposed chars

'=============Функция перекодировки===================
Public Function Convert(ByVal strSrc As String, ByVal nFromCP As Long, ByVal nToCP As Long) As String
Dim nLen As Long
Dim strDst As String
Dim strRet As String
Dim nRet As Long
nLen = Len(strSrc)
strDst = String(nLen * 2, Chr(0))
strRet = String(nLen * 2, Chr(0))
nRet = MultiByteToWideChar(nFromCP, MB_PRECOMPOSED, strSrc, nLen, strDst, nLen)
nRet = WideCharToMultiByte(nToCP, 0, strDst, nRet, strRet, nLen * 2, ByVal 0, 0)
Convert = Left(strRet, nRet)
End Function

Пример
Имеем, допустим, TextBox. В нем текст в кодировке KOI, надо получить в Windows. Запускаешь:
TextBox = StringConvert(TextBox, 20866, 1251)

Значения для часто используемых кодировок:
Central European (DOS) 852
Central European Alphabet (Windows) 1250
Central European Alphabet (ISO) 28592
Cyrillic Alphabet (DOS) 866
Cyrillic Alphabet (Windows) 1251
Cyrillic Alphabet (ISO) 28595
Cyrillic Alphabet (KOI8-R) 20866
Ukrainian Alphabet (KOI8-RU) 21866
Latin 3 Alphabet (ISO) 28593
Western Alphabet 1252
Baltic Alphabet (Windows) 1257
Baltic Alphabet (ISO) 28594
Greek Alphabet (Windows) 1253
Greek Alphabet (ISO) 28597
Turkish Alphabet 1254
Arabic Alphabet (Windows) 1256
Arabic Alphabet (ISO) 28596
Hebrew (DOS) 862
Hebrew Alphabet (Windows) 1255
Народ подскажите этот пример не работает с кодировкой utf8. что в одну так и в другую сторону.
нашел пример перевода из utf8
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Dim sOut As String, sIn As String, OutLength As Long

sIn = Text1.Text
sOut = sIn
OutLength =  0 
Dim i&, Char As Byte, CharPercent As Byte
CharPercent = Asc("%")
For i =  1  To Len(sIn)
Char = Asc(Mid$(sIn, i,  1 ))
If Char = CharPercent Then
Char = CByte("&H" & Mid$(sIn, i +  1 ,  2 ))
i = i +  2 
End If
OutLength = OutLength +  1 
Mid$(sOut, OutLength,  1 ) = Chr$(Char)
Next i

s = sOut
s = Left$(s, MultiByteToWideChar(CP_UTF8,  0 , sOut, - 1 , StrPtr(s), LenB(s)))
Text2.Text = s
А как например перекодировать из win в utf8 ???
...
Рейтинг: 0 / 0
как перекодировать имя файла
    #34957621
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
StrConv("test", vbUnicode)
?

I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
как перекодировать имя файла
    #34957962
Belkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HandKot
Код: plaintext
StrConv("test", vbUnicode)
?

I Have Nine Lives You Have One Only
THINK!
Да та функция кодирует в одну сторону и обратно хорошо.
Но попробуй перекодировать и з utf8 строку
Добавление/удаление услуг
Я ее взял из интернет экслорера (он ее переводит из одной кодировки в другую)

Андрей.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / как перекодировать имя файла
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]