Как Вы указываете Java file.encoding значение, согласовывающееся с базовой кодовой страницей Windows?

Simon White из Catalysoft написал статью об очень умном алгоритме, который сравнивает пар смежного символа, который работает действительно хорошо на мои цели:

http://www.catalysoft.com/articles/StrikeAMatch.html

у Simon есть версия Java алгоритма, и ниже я записал МН версию / версию Ruby ее (взятый от простой рубиновой версии, сделанной в связанном комментарии записи форума Mark Wong-VanHaren) так, чтобы я мог использовать ее в своих запросах PostgreSQL:

CREATE FUNCTION string_similarity(str1 varchar, str2 varchar)
RETURNS float8 AS '

str1.downcase! 
pairs1 = (0..str1.length-2).collect {|i| str1[i,2]}.reject {
  |pair| pair.include? " "}
str2.downcase! 
pairs2 = (0..str2.length-2).collect {|i| str2[i,2]}.reject {
  |pair| pair.include? " "}
union = pairs1.size + pairs2.size 
intersection = 0 
pairs1.each do |p1| 
  0.upto(pairs2.size-1) do |i| 
    if p1 == pairs2[i] 
      intersection += 1 
      pairs2.slice!(i) 
      break 
    end 
  end 
end 
(2.0 * intersection) / union

' LANGUAGE 'plruby';

Работы как очарование!

7
задан Rob Kennedy 26 August 2009 в 19:23
поделиться

4 ответа

cmd.exe использует кодировку по умолчанию Cp850 (или любой другой CP "OEM", родной для ОС); системная кодировка Cp1252 (или любой другой CP "ANSI", свойственный ОС). Кровавые подробности здесь . Один из способов узнать кодировку консоли - это сделать это с помощью собственного кода (см. GetConsoleOutputCP для текущей кодировки консоли; см. GetACP для кодировки по умолчанию "ANSI"; и т. Д. .).

Изменение кодировки с помощью переключателя -D повлияет на все ваши механизмы кодирования по умолчанию, включая перенаправленный stdout / stdin / stderr. Это не идеальное решение.

Я придумал этот сценарий WSH, который может настроить консоль на системную кодовую страницу ANSI, но не t выяснил, как программно переключиться на шрифт TrueType.

'file:  setacp.vbs
'usage: cscript /Nologo setacp.vbs
Set objShell = CreateObject("WScript.Shell")
'replace ACP (ANSI) with OEMCP for default console CP
cp = objShell.RegRead("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001" &_
                              "\Control\Nls\CodePage\ACP")
WScript.Echo "Switching console code page to " & cp
objShell.Exec "chcp.com " & cp

(Это мой первый сценарий WSH, поэтому он может быть ошибочным - я не знаком с разрешениями на чтение реестра.)

Использование шрифта TrueType - еще одно требование. для использования ANSI / Unicode с cmd.exe . Я собираюсь рассмотреть программный переход на лучший шрифт, когда позволит время.

6
ответ дан 6 December 2019 в 10:02
поделиться

Что касается фрагмента кода, правильный ответ - использовать соответствующий конструктор для InputStreamReader, который выполняет правильное преобразование кода. Таким образом, не имеет значения, какая кодировка используется по умолчанию в системе, вы знаете, что получаете правильную кодировку, которая соответствует тому, что вы получаете в сокете.

Затем вы можете указать кодировку при записи файлов, если вам нужно, а не полагаться на системную кодировку, но, конечно, когда они открывают файлы в этой системе, у них могут быть проблемы, но современные системы Windows поддерживают UTF-8,

5
ответ дан 6 December 2019 в 10:02
поделиться

Windows has the added complication of having two active codepages. In your example both 1252 and 850 are correct, but they depend on the way the program is being run. For GUI applications, Windows will use the ANSI code page, which for Western European languages will typically be 1252. However, the command line will report the OEM codepage which is 850 for the same locales.

4
ответ дан 6 December 2019 в 10:02
поделиться

Если значение кодовой страницы, возвращаемое командой chcp, вернет нужное значение, вы можете использовать следующую команду для получения кодовой страницы

C:\>for /F "Tokens=4" %I in ('chcp') Do Set CodePage=%I

. Это устанавливает для переменной CodePage значение значение кодовой страницы, возвращаемое из chcp

C:\>echo %CodePage%
437

. Вы можете использовать это значение в своем bat-файле, добавив к нему префикс Cp

C:\>echo Cp%CodePage%
Cp437

. Если вы поместите это в bat-файл, значения% I в первой команде необходимо будет заменить с %% I

4
ответ дан 6 December 2019 в 10:02
поделиться