Всем привет!
Формирую из данных csv файл и отправлю его на почту. Все хорошо было. При тесте на проде(УЖЕ!) заметили что бывают проблемы с кодировкой с определённого источника. Мало того что появляются непонятные символы, так еще и перестают работать нормально реплейсы на ('\n') и на ('\r\n'), причем рамдомно.
Попробовал сделать с телом csv таую операцию:
CSVbody = EncodingUtil.urlEncode(CSVbody, 'UTF-8');
CSVbody = EncodingUtil.urlDecode(CSVbody, 'UTF-8');
Всем привет! Формирую из данных csv файл и отправлю его на почту. Все хорошо было. При тесте на проде(УЖЕ!) заметили что бывают проблемы с кодировкой с определённого источника. Мало того что появляются непонятные символы, так еще и перестают работать нормально реплейсы на ('\n') и на ('\r\n'), причем рамдомно. Попробовал сделать с телом csv таую операцию: [code] CSVbody = EncodingUtil.urlEncode(CSVbody, 'UTF-8'); CSVbody = EncodingUtil.urlDecode(CSVbody, 'UTF-8'); [/code] Не помогло... Какие могут быть варианты? [img]http://cs622830.vk.me/v622830418/48a0d/jXjh5AmZcEM.jpg[/img] [img]http://cs622830.vk.me/v622830418/48a16/HY9V2zMv8QA.jpg[/img]
Так надо искать проблемы в "определенном источнике"? Может SF тут не при чем?
Так надо искать проблемы в "определенном источнике"? Может SF тут не при чем?
Ну данные берутся из полей в объекте. Имеется ввиду что может их туда внесли както не так. Но заказчику не объяснишь же.
Ну данные берутся из полей в объекте. Имеется ввиду что может их туда внесли както не так. Но заказчику не объяснишь же.
К примеру я беру инфу из поля, копирую ее в нотпад++ сохраняю где-нить, копирую вставляю обратно в SF, и все нормально отрабатывает!
К примеру я беру инфу из поля, копирую ее в нотпад++ сохраняю где-нить, копирую вставляю обратно в SF, и все нормально отрабатывает!
а можно что-то подобное сделать програмно. то есть конвертировать исходный файл в какой-нибудь текстовый формат, откуда он вернется обратно в УТФ8 уже нормальным и здоровым? других вариантов у меня нет
[quote="DevNull"]я беру инфу из поля, копирую ее в нотпад++ сохраняю где-нить, копирую вставляю обратно в SF[/quote] а можно что-то подобное сделать програмно. то есть конвертировать исходный файл в какой-нибудь текстовый формат, откуда он вернется обратно в УТФ8 уже нормальным и здоровым? других вариантов у меня нет
А можно пример кода как именно эти данные формируются?
[quote="DevNull"]Формирую из данных csv файл и отправлю его на почту.[/quote] А можно пример кода как именно эти данные формируются?
С переносами я разобрался. Это был глюк данных, перезалил через DL и все стало хорошо.
Осталась проблема с знаками непонятными. Суть в чем. Данные в SF забиты на испанском, немецком и т.д. В них есть определенные символы. В самом SF отображается нормально. Но вот в csv как то криво.
Данные формируются обычной стрингой:
CSVbody = CSVbody + formatString(a.SalesOrder) + ',' + formatString(a.QUOTE) + ',' + formatString(a.COUNTRY) + ',' + formatString(a.STORENAME) + ',' + formatString(a.DELIVERABLE) + ',' + formatString(a.STATUS) + ',' + formatString(a.AddedtoRegional) + ',' + formatString(a.STORESITEINFO) + ',' + formatString(a.HandoverDate) + ',' + formatString(a.StoreOpeningDate) + ',' + formatString(a.INSTALLDATE) + ',' + formatString(a.INSTALLTIME) + ',' + formatString(a.STORENUMBER_UNIQUEID) + ',' + formatString(a.VGNUMBER) + ',' + formatString(a.CGB_MBRNUMBER) + ',' + formatString(a.ADDRESS) + ',' + formatString(a.CITY) + ',' + formatString(a.STATE) + ',' + formatString(a.ZIPCODE) + ',' + formatString(a.STORECONTACT) + ',' + formatString(a.STORECONTACTNUMBER) + ',' + formatString(a.SHIPPINGADDRESS) + ',' + formatString(a.STOREHOURS) + ',' + formatString(a.ENTRANCE) + ',' + formatString(a.INTERNETCONNECTION) + ',' + formatString(a.CABLEROUGHINDATE) + ',' + formatString(a.BarberChair) + ',' + formatString(a.EQUIPMENTSTATUS) + ',' + formatString(a.IPrange) + ',' + formatString(a.RNVersion) + ',' + formatString(a.trafficlic) + ',' + formatString(a.demographiclic) + ',' + formatString(a.TRACKING) + ',' + formatString(a.ShippingCarrier) + ',' + formatString(a.Timezone) + ',' + formatString(a.NOTESstore) + ',' + formatString(a.SYSTEMNAME) + ',' + formatString(a.DeviceHostname) + ',' + formatString(a.ProductSKU) + ',' + formatString(a.SERIALNUMBER) + ',' + formatString(a.DeviceID) + ',' + formatString(a.IPAddress) + ',' + formatString(a.TwondIP) + ',' + formatString(a.Netmask) + ',' + formatString(a.Gateway) + ',' + formatString(a.DNS1) + ',' + formatString(a.DNS2) + ',' + formatString(a.SMTP) + ',' + formatString(a.ENTRANCEWIDTH) + ',' + formatString(a.ENTRANCEHEIGHT) + ',' + formatString(a.CEILINGHEIGHT) + ',' + formatString(a.CEILINGCOLOR) + ',' + formatString(a.CAMERACOLOR) + ',' + formatString(a.EXTRAEQUIPMENT) + ',' + formatString(a.TimeServer) + ',' + formatString(a.DataDeliveryIP_RNserver) + ',' + formatString(a.HTTPURLPath) + ',' + formatString(a.HTTPPort) + ',' + formatString(a.Firmware) + ',' + formatString(a.External_WANIP) + ',' + formatString(a.Username) + ',' + formatString(a.Password) + ',' + formatString(a.Reporting) + ',' + formatString(a.NOTEScamera) + ',' + formatString(a.BOMname) + '\n';
С переносами я разобрался. Это был глюк данных, перезалил через DL и все стало хорошо. Осталась проблема с знаками непонятными. Суть в чем. Данные в SF забиты на испанском, немецком и т.д. В них есть определенные символы. В самом SF отображается нормально. Но вот в csv как то криво. Данные формируются обычной стрингой: [code] CSVbody = CSVbody + formatString(a.SalesOrder) + ',' + formatString(a.QUOTE) + ',' + formatString(a.COUNTRY) + ',' + formatString(a.STORENAME) + ',' + formatString(a.DELIVERABLE) + ',' + formatString(a.STATUS) + ',' + formatString(a.AddedtoRegional) + ',' + formatString(a.STORESITEINFO) + ',' + formatString(a.HandoverDate) + ',' + formatString(a.StoreOpeningDate) + ',' + formatString(a.INSTALLDATE) + ',' + formatString(a.INSTALLTIME) + ',' + formatString(a.STORENUMBER_UNIQUEID) + ',' + formatString(a.VGNUMBER) + ',' + formatString(a.CGB_MBRNUMBER) + ',' + formatString(a.ADDRESS) + ',' + formatString(a.CITY) + ',' + formatString(a.STATE) + ',' + formatString(a.ZIPCODE) + ',' + formatString(a.STORECONTACT) + ',' + formatString(a.STORECONTACTNUMBER) + ',' + formatString(a.SHIPPINGADDRESS) + ',' + formatString(a.STOREHOURS) + ',' + formatString(a.ENTRANCE) + ',' + formatString(a.INTERNETCONNECTION) + ',' + formatString(a.CABLEROUGHINDATE) + ',' + formatString(a.BarberChair) + ',' + formatString(a.EQUIPMENTSTATUS) + ',' + formatString(a.IPrange) + ',' + formatString(a.RNVersion) + ',' + formatString(a.trafficlic) + ',' + formatString(a.demographiclic) + ',' + formatString(a.TRACKING) + ',' + formatString(a.ShippingCarrier) + ',' + formatString(a.Timezone) + ',' + formatString(a.NOTESstore) + ',' + formatString(a.SYSTEMNAME) + ',' + formatString(a.DeviceHostname) + ',' + formatString(a.ProductSKU) + ',' + formatString(a.SERIALNUMBER) + ',' + formatString(a.DeviceID) + ',' + formatString(a.IPAddress) + ',' + formatString(a.TwondIP) + ',' + formatString(a.Netmask) + ',' + formatString(a.Gateway) + ',' + formatString(a.DNS1) + ',' + formatString(a.DNS2) + ',' + formatString(a.SMTP) + ',' + formatString(a.ENTRANCEWIDTH) + ',' + formatString(a.ENTRANCEHEIGHT) + ',' + formatString(a.CEILINGHEIGHT) + ',' + formatString(a.CEILINGCOLOR) + ',' + formatString(a.CAMERACOLOR) + ',' + formatString(a.EXTRAEQUIPMENT) + ',' + formatString(a.TimeServer) + ',' + formatString(a.DataDeliveryIP_RNserver) + ',' + formatString(a.HTTPURLPath) + ',' + formatString(a.HTTPPort) + ',' + formatString(a.Firmware) + ',' + formatString(a.External_WANIP) + ',' + formatString(a.Username) + ',' + formatString(a.Password) + ',' + formatString(a.Reporting) + ',' + formatString(a.NOTEScamera) + ',' + formatString(a.BOMname) + '\n'; [/code]
пример кода просто для справочника как делвть не стоит. Как мне кажется...
[quote="DevNull"]Данные формируются обычной стрингой: [/quote] :) пример кода просто для справочника как делвть не стоит. Как мне кажется...
А как стоит?
А как стоит?
set<String> fields = new set<String>{'SalesOrder', ...};
String[] values = new String[]{};
for (String el : fields) {
values.add(formatString(a.get(el)));
}
CSVbody = CSVbody + string.join(values,',') + '\n';
Что-то вроде этого. Код не тестировал. Так что возможны мелкие баги.
[code] set<String> fields = new set<String>{'SalesOrder', ...}; String[] values = new String[]{}; for (String el : fields) { values.add(formatString(a.get(el))); } CSVbody = CSVbody + string.join(values,',') + '\n'; [/code] Что-то вроде этого. Код не тестировал. Так что возможны мелкие баги.
По сути да... Так намного красивей.
По сути да... Так намного красивей.
А код метода formatString, если не сложно?
А код метода formatString, если не сложно?
Да там просто реплейсы на \n.
По поводу непонятных символах. Вопрос оказался намного проще. Мой нотпад, и редактор клиента просто не поддерживал немецкие спецсимволы, поэтому так и отображал. А клиент панику поднял)
Проблема по поводу переноса строк решилась выгрузкой DL и обратной загрузкой. Видно что то в форматировании данных глюкануло.
[quote="ilya leshchuk"]А код метода formatString, если не сложно?[/quote] Да там просто реплейсы на \n. По поводу непонятных символах. Вопрос оказался намного проще. Мой нотпад, и редактор клиента просто не поддерживал немецкие спецсимволы, поэтому так и отображал. А клиент панику поднял) Проблема по поводу переноса строк решилась выгрузкой DL и обратной загрузкой. Видно что то в форматировании данных глюкануло.
Я б всё-таки добавил туда минимум использование String.escapeCsv().
Я б всё-таки добавил туда минимум использование String.escapeCsv().