13
Авг
2015

Проблема с кодировкой windows-1251 на linux

Читаю txt-файлы в java/groovy в кодировке WINDOWS-1251.

Часть файлов читается успешно, но один файл из читается успешно только под windows, а под linux кодировка обрабатывается неверно.

Код чтения из файла Groovy

  String fileEncoding = "cp1251"
  file.eachLine(fileEncoding) { line -> esvData << line.split('=')
    System.out.println(line)}

В логе на Windows видны русские буквы, а на i686-redhat-linux(6.0) лог имеет следующий вид:

1CClientBankExchange ВерсияФормата=1.02 Кодировка=Windows Отправитель= Получатель= ДатаСоздания=23.03.2015 ВремяСоздания=01:46:15 ДатаНачала=20.03.2015 ДатаКонца=20.03.2015 РасчСчет=407028

При этом файлы в кодировке windows-1251 из других источников обрабатываются успешно на том же linux.

В чем-то, кроме кодировки, может быть разница? Слышал, что могут присутствовать какие-то доп. символы в начале файла.

package com.peterservice.pays.filepay.camel.processors.inscriptproc;

import com.peterservice.pays.filepay.camel.processors.InScriptProc;
import com.peterservice.pays.filepay.enums.CamelProperties;
import com.peterservice.pays.filepay.enums.Directories;
import com.peterservice.pays.filepay.model.Pay;
import com.peterservice.pays.filepay.model.PayRoute;
import org.apache.camel.Exchange;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.impl.DefaultExchange;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;

import java.io.File;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by Yuriy.Vinogradov on 06.08.2015.
 */
public class InScriptProc1CTest {

    @Test
    public void test() throws Exception {
        InScriptProc processor = new InScriptProc();
        Exchange exchange = prepareExchange();
        processor.process(exchange);
        Pay[] payments = exchange.getIn().getBody(Pay[].class);
        Assert.assertEquals(256, payments.length);
        for (Pay payment : payments) {
            if (payment.number.equals("549")) {
                Assert.assertEquals(new BigDecimal("0.4"), payment.amount);
                Assert.assertEquals("2015-03-20", payment.inDate);
                Assert.assertEquals("770fgh320", payment.INN);
                Assert.assertEquals("770fhh001", payment.payerKpp);
                Assert.assertEquals("401058fgh000fh79", payment.payerAccount);
                Assert.assertEquals("УФК по г.Москве (ФКУ \"Дирекция космодрома \"Восточный\")", payment.payerTitle);
                Assert.assertEquals("25904fgh2221 0373fg910 Опл.  за услуги сот.связи за декабрь2014, дог.от 12.12.14  №2350948, сч.14-1 от 26.12.2014, акт  DV03/70761371/28  от 26,12,2014 , в т.ч. НДС-0,06 (л/с 15fg925)", payment.paymentReason);
            } else if(payment.number.equals("701")) {
                Assert.assertEquals(new BigDecimal("1.79"), payment.amount);
                Assert.assertEquals("2015-03-20", payment.inDate);
                Assert.assertEquals("2815fff915", payment.INN);
                Assert.assertEquals("27fff1001", payment.payerKpp);
                Assert.assertEquals("30302810fffh0000100", payment.payerAccount);
                Assert.assertEquals("ФКП \"Аэропорты Дальнего Востока\" р/с 40502810409fghfh001 в ХФ ОАО \"МДМ БАНК\"  г Хабаровск", payment.payerTitle);
                Assert.assertEquals("УИНО///Оплата по сч-фак. №10010687719/800 от 28.02.2015 л/счет 1fgh4543. Сумма 1-79 В т.ч. НДС  (18%) 0-27", payment.paymentReason);
            } else if(payment.number.equals("822")) {
                Assert.assertEquals(new BigDecimal("50"), payment.amount);
            }else{
           //     Assert.fail("Not expected document number:" + payment.number + " Check if it is correct and create if branch for this document number");
            }
        } 
    }

    private Exchange prepareExchange() {
        Exchange exchange = new DefaultExchange(new DefaultCamelContext());
        PayRoute payRoute = new PayRoute();
        exchange.getIn().setBody(payRoute);
        payRoute.setInScript("src/scripts/1c-java.groovy");
        Map<String, String> resultDirs = new HashMap<>();
        resultDirs.put(Directories.ERROR.title, "test/" + Directories.ERROR.title + "/dir/");
        resultDirs.put(Directories.GF.title, "test/" + Directories.GF.title + "/dir/");
        resultDirs.put(Directories.LG.title, "test/" + Directories.LG.title + "/dir/");
        resultDirs.put(Directories.UNDEFINED.title, "test/" + Directories.GF.title + "/dir/");
        resultDirs.put(Directories.LOG.title, "test/" + Directories.LOG.title + "/dir/");
        payRoute.setResultDirs(resultDirs);
        exchange.setProperty(CamelProperties.ProcessingFile.title, new File("src/test/resources/sberbank_27_20150320_1.txt").getAbsoluteFile());
        return exchange;
    }
}

hexdump для проверки начала файла на bom

[relstand@srv3-amain-a test]$ hexdump -C sberbank_27_20150320_1.txt | head
00000000  31 43 43 6c 69 65 6e 74  42 61 6e 6b 45 78 63 68  |1CClientBankExch|
00000010  61 6e 67 65 0d 0a c2 e5  f0 f1 e8 ff d4 ee f0 ec  |ange............|

Источник: https://ru.stackoverflow.com/questions/442570/%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0-%D1%81-%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%BE%D0%B9-windows-1251-%D0%BD%D0%B0-linux

Share

Тебе может это понравится...