SASGIS - SAS.Планета
View Issue Details
0002870SAS.Планета[All Projects] Багpublic28-10-2015 09:1413-05-2016 07:20
vdemidov 
zed 
normalminoralways
closedwon't fix 
151010 
 
0002870: Тайлохранилище GoogleEarth не поддерживает юникодные пути
Тайлохранлище реализованное в TTileStorageGoogleEarth с использованием DLL не сможет работать с юникодными путями в юникодной версии, так как в DLL есть только функция поддерживающая AnsiString
No tags attached.
parent of 0002911resolved vdemidov Добавить в ITileStorageTypeAbilities информацию о поддержке юникода в пути к тайлохранилищу 
Issue History
28-10-2015 09:14vdemidovNew Issue
28-10-2015 09:16vdemidovIssue cloned: 0002871
28-10-2015 09:29vdemidovStatusnew => assigned
28-10-2015 09:29vdemidovAssigned To => zed
28-10-2015 09:29vdemidovTarget Version => 24xxxx
30-10-2015 10:36zedNote Added: 0016657
30-10-2015 10:58vdemidovNote Added: 0016659
30-10-2015 11:40zedNote Added: 0016664
30-10-2015 11:50vdemidovNote Added: 0016666
18-11-2015 10:14vdemidovRelationship addedparent of 0002911
11-05-2016 08:12zedStatusassigned => closed
11-05-2016 08:12zedResolutionopen => won't fix
13-05-2016 07:20vdemidovTarget Version24xxxx =>

Notes
(0016657)
zed   
30-10-2015 10:36   
Тут засада с LevelDB, у неё метод open определён как:

extern leveldb_t* leveldb_open(
    const leveldb_options_t* options,
    const char* name,
    char** errptr);

так что в name можно передать только ансишную строку.

Некоторые выкручиваются вот таким нехорошим способом, со сменой рабочей директории:

        if sys.platform.startswith('win'):
            # resolve unicode path problem on Windows
            old_cwd = os.path.abspath(u'.')
            relative_path = os.path.relpath(store_dir, state_dir)
            os.chdir(state_dir)
            self._db = self._leveldb(relative_path)
            os.chdir(old_cwd)
        else:
            self._db = self._leveldb(store_dir)

Стоит такое вкорячивать?
(0016659)
vdemidov   
30-10-2015 10:58   
И что оно совсем никак utf-8 не понимает? Странно.
(0016664)
zed   
30-10-2015 11:40   
Оно написано для *nix, а там как правило системная кодировка utf-8 и там всё работает через char. Для Windows же официального порта нету и гугловцам пофиг, как там что работает: Error when opening paths with unicode characters.

Хотя не понятно, почему такого порта нет, они ведь в любом случае собирают GoogleEarth под Windows и он эту либу юзает, хоть она и вкомпилена в него.

По-идее, можно пропатчить этот метод, чтобы он принимал на вход widestring:

leveldb_t* leveldb_open(
    const leveldb_options_t* options,
    const char* name,
    char** errptr) {
  DB* db;
  if (SaveError(errptr, DB::Open(options->rep, std::string(name), &db))) {
    return NULL;
  }
  leveldb_t* result = new leveldb_t;
  result->rep = db;
  return result;
}

И, соответственно, не забыть при сборке либы включить юникодные строки. Может быть поможет.
(0016666)
vdemidov   
30-10-2015 11:50   
Может тогда лучше пусть уж принимает в utf-8, раз уж все равно начинать патчить либу? Или отдельную функцию для открытия сделать?