Добавьте названия неASCII-файла для архивирования в Java

Я создал одну функцию, которая делает то, что нужно. Я надеюсь, что это нормально.

function scrollUpOrDown(_this, state) {
  var portImg = _this.parentNode.parentNode.querySelector('img.item');
  var height = portImg.clientHeight;

  if(state.id > -1) {
    clearInterval(state.id);
    state.dir *= -1;
  }

  if(state.pos < 0) {
    state.pos = 1;
  }
  state.id = setInterval(frame, 5);

  function frame() {
    if ((state.pos == height - 500 && state.dir > 0) || (state.pos == 0 && state.dir < 0)) {
      clearInterval(state.id);
    } else {
      state.pos += state.dir;
      portImg.style.top = -+state.pos + "px";
    }
  }
}

for (const button of document.querySelectorAll("button.portScroll")) {
  let scollingState = {
    pos: -1,
    id: -1,
    dir: 1
  };
  if (button.classList.contains("down")) {
    button.addEventListener("click", function(){
      scrollUpOrDown(this,scollingState);
    });
  }
}

https://codepen.io/prtjohanson/pen/QoEyQK

Если вам интересно, почему / как это работает, посмотрите на вывод этого кода [116 ]

var array = [0,1,2,3,4,5];

for(const i in array) {
  setTimeout(function(){console.log(i)}, Math.random()*1000)
}

и прочитайте https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let#Scoping_rules_2

19
задан Micke 20 September 2008 в 00:35
поделиться

6 ответов

Кодирование для Записей Файла в ZIP первоначально указано как Кодовая страница 437 IBM. Много символов, используемых на других языках, невозможны использовать тот путь.

PKWARE-спецификация относится к проблеме и добавляет немного. Но это - более позднее дополнение (с 2007, благодаря Cheeso для разрешения этого, см. комментарии). Если тот бит установлен, запись имени файла должны быть закодированы в UTF-8. Это расширение описано в 'ПРИЛОЖЕНИИ D - Язык, Кодирующий (EFS)', который является в конце связанного документа.

Для Java это - известная ошибка, для попадения в беду с non-ASCII-characters. См. ошибка № 4244499 и высокое количество связанных ошибок.

Мой коллега использовал в качестве Кодирования URL обходного решения для имен файлов прежде, чем сохранить их в ZIP и декодировать после чтения их. Если Вы управляете обоими, храня и читая, который может быть обходным решением.

РЕДАКТИРОВАНИЕ: В ошибке кто-то предлагает использовать ZipOutputStream от Муравья Apache как обходное решение. Эта реализация позволяет спецификацию кодирования.

10
ответ дан 30 November 2019 в 03:38
поделиться

В zip-файлах, согласно спецификации, принадлежавшей PKWare, кодирование имен файлов и комментариев файла является IBM437. В 2007 PKWare расширил спецификацию, чтобы также позволить UTF-8. Это ничего не говорит о кодировании файлов, содержавших в zip. Только кодирование имен файлов.

я думаю, все инструменты и библиотеки (Java и не Java) поддерживают IBM437 (который является надмножеством ASCII), и меньше инструментов и библиотек поддерживают UTF-8. Некоторые инструменты и освобождают, поддерживают другие кодовые страницы. Например, при архивировании чего-то использование WinRar на компьютере, работающем в Шанхае Вы получите кодовую страницу Big5. Это не "позволяется" спецификацией zip, но это происходит так или иначе.

библиотека DotNetZip для.NET делает Unicode, но конечно который не помогает Вам, если Вы используете Java!

Используя Java встроенная поддержка ZIP, Вы будете всегда получать IBM437. Если Вы хотите архив с чем-то другим, чем IBM437, то пользуетесь сторонней библиотекой или создаете JAR.

8
ответ дан 30 November 2019 в 03:38
поделиться

От беглого взгляда на руководство TrueZIP - они рекомендуют формат JAR:

Это использует UTF-8 для кодирования имени файла и комментариев - в отличие от ZIP, который только использует IBM437.

Это, вероятно, означает, что API использует java.util.zip пакет для его реализации; та документация указывает, что все еще использует формат ZIP с 1996 . Поддержка Unicode не была добавлена к PKWARE.ZIP Спецификация Формата файла до 2006.

3
ответ дан 30 November 2019 в 03:38
поделиться

Это на самом деле перестало работать или было просто проблемой шрифта? (например, шрифт, имеющий различные глифы для тех charcodes), я видел подобные проблемы в Windows, где рендеринг "повредился", потому что шрифт не поддерживал набор символов, но данные были на самом деле неповреждены и корректны.

0
ответ дан 30 November 2019 в 03:38
поделиться

Названия неASCII-файла не надежны через реализации ZIP и лучше всего избегаются. Нет никакого условия для хранения установки набора символов в zip-файлах; клиенты склонны предполагать с 'кодовой страницей существующей системы', которая вряд ли будет тем, что Вы хотите. Много комбинаций клиента и кодовой страницы могут привести к недоступным файлам.

Извините!

0
ответ дан 30 November 2019 в 03:38
поделиться

Чудеса действительно случаются, и Sun/Oracle действительно исправили давнюю ошибку/rfe:

Теперь можно устанавливать кодировки имен файлов при создании zip-файла/потока (требуется Java 7).

8
ответ дан 30 November 2019 в 03:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: