2016-12-01 4 views
0

У меня есть Java-программа, которая почти отлично работает. Я развиваюсь на Mac и подталкиваю к Linux для производства. Когда mac ищет файловую систему и вставляет новые имена файлов в базу данных, она отлично работает. Однако, когда я нажимаю на окно linux и выполняю поиск/вставку, он находит файлы с некоторыми символами как разные IE: Béla Fleck. Они выглядят идентично мне в базе данных и в файловых системах Mac AND Linux. Фактически, в блоках mac и linux есть NFS-монтирования для третьей системы (linux), где находятся файлы.java читает имена файлов файловой системы по-разному на osx и linux

Я сбросил байты и вижу, как linux и mac видят строку из файловой системы: Béla Fleck.

линукс:

utf8bytes[0] = 0x42 
utf8bytes[1] = 0x65 
utf8bytes[2] = 0xcc 
utf8bytes[3] = 0x81 
utf8bytes[4] = 0x6c 
utf8bytes[5] = 0x61 
utf8bytes[6] = 0x20 
utf8bytes[7] = 0x46 
utf8bytes[8] = 0x6c 
utf8bytes[9] = 0x65 
utf8bytes[10] = 0x63 
utf8bytes[11] = 0x6b 

linux says LANG=en_US.UTF-8 

макинтош:

utf8Bytes[0] = 0x42 
utf8Bytes[1] = 0xc3 
utf8Bytes[2] = 0xa9 
utf8Bytes[3] = 0x6c 
utf8Bytes[4] = 0x61 
utf8Bytes[5] = 0x20 
utf8Bytes[6] = 0x46 
utf8Bytes[7] = 0x6c 
utf8Bytes[8] = 0x65 
utf8Bytes[9] = 0x63 
utf8Bytes[10] = 0x6b 

mac says LANG=en_US.UTF-8 

попробовал это, до сих пор нет радости.

java -Dfile.encoding=UTF-8 

Я использую Java NIO файл, чтобы получить каталог:

java.nio.file.Path path = Paths.get("test"); 

затем идущий по пути с

Files.walkFileTree(path, new SimpleFileVisitor<Path>() { 

, а затем, так как это подкаталог в тестовом пути :

file.getParent().getName(1).toString() 

У кого-либо есть идентификатор что происходит, и как я могу это исправить?

Спасибо.

+0

Они выглядят одинаково, так как имя файла Mac содержит один акцентированный «E» символ ('é'), в то время как имя файла Linux содержит простой«е»характер с последующим комбинационной акцентом (' е'¯'). Визуально они выглядят одинаково, и большинство [Collators] (http://docs.oracle.com/javase/8/docs/api/java/text/Collator.html) будут считать их идентичными. Что касается того, почему они разные, трудно сказать, не видя кода, который получает/создает имена файлов. – VGR

+0

добавил java.nio.file звонки – phomlish

ответ

2

Некоторые поиск показал, что OS X всегда раскладывается имена файлов:

Это говорит мне, что вы, возможно, случайно переключил выходы: массив первого байта разложен, поэтому я предполагаю, что он был взят с Mac, а второй - с Linux.

В любом случае, если вы хотите, чтобы они были одинаковыми для всех систем, вы можете сделать разложение самостоятельно: (. Не совсем ответ, просто больше обсуждения)

String name = file.getParent().getName(1).toString(); 
name = Normalizer.normalize(name, Normalizer.Form.NFD); 
+0

Пора мне узнать, что делает нормализатор, о котором вы говорите. Это сработало, как вы заявили. – phomlish

+1

[документация для нормализатора] (http://docs.oracle.com/javase/8/docs/api/java/text/Normalizer.html) содержит ссылку на спецификацию Юникода, в которой изложена концепция нормализации. – VGR

1

Те, кажется, быть utf8 персонажами, но сформированы по-разному.

c4a9 is é - Обычно это как вводить акцентированное письмо.

Тем не менее, можно использовать пару символов:

65cc91 является , но выполненный в виде комбинации e и «COMBINING инвертируется BREVE».c3aa является единственным символом ê

Некоторые COLLATIONs могут компенсировать отличия, но это зависит от приложения, чтобы комбинировать их в момент основного хода.

SELECT CAST(UNHEX('65cc91') AS CHAR) = 
     CAST(UNHEX('c3aa') AS CHAR) COLLATE utf8_unicode_520_ci; --> 1