powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / XML UTF-8 --> XML Cp1251 Как перекодировать? Экспорт Excel в базу через XML.
6 сообщений из 6, страница 1 из 1
XML UTF-8 --> XML Cp1251 Как перекодировать? Экспорт Excel в базу через XML.
    #33201611
Alexey Turn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сохраняю Excel- евскую книгу как xml таблицу.
Получаем XML в кодировке UTF-8.
Закачиваю на сервер методом FileUpload.

На сервере:

Код: plaintext
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse( new  ByteArrayInputStream(file));

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

Везде стоит кодировка Сp1251. Исходную кодировку xml изменить нельзя.

Экспорт в базу данных не получается из-за кодировки. Что делать?

Как превратить xml из UTF-8 в Cp1251 сразу, как только получили?
...
Рейтинг: 0 / 0
XML UTF-8 --> XML Cp1251 Как перекодировать? Экспорт Excel в базу через XML.
    #33201714
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты с экселем через Java работаешь?

Можно и на сервере дело поправить, у тебя возникает косяк, т.к. на сервере, если я правильно понял, стоит виндовая локаль и он твои файлы в юникоде, воспринимает как в кодировке win-1251, ты ему явно укажи, что приходящие данный в UTF8, может тогда и на клиенте ничего делать не нужно будет.
...
Рейтинг: 0 / 0
XML UTF-8 --> XML Cp1251 Как перекодировать? Экспорт Excel в базу через XML.
    #33201724
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ты переменную file как вобще формируешь?
...
Рейтинг: 0 / 0
XML UTF-8 --> XML Cp1251 Как перекодировать? Экспорт Excel в базу через XML.
    #33203138
Alexey Turn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для аплоада файла я использую Надстройку SpringFramework а над Commons-FileUpload.
Т.е переменную file просто беру:

Код: plaintext
1.
UploadBean bean = (UploadBean) command;
 byte [] file = bean.getFile();

Устанавливал кодировку utf-8 для multipart-resolver-а не помогло.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
<bean id="multipartResolver"  class ="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize">
<value> 100000 </value>
</property>
<property name="defaultEncoding">
<value>Cp1251</value>
</property>
</bean>

Исходники spring-а править вобщем -то в лом.

А потому стоит вопрос. Как здесь лучше поступить?

По идее из xml у меня формируются executeUpdate запросы типа:
Insert into table () values ()

База в кодировке Cp1251. И при попытке выполнить запрос вылетает исключение - ошибка синтаксиса.

Как бы разрулить это, подскажите. А то в кодировках совсем запутался.
...
Рейтинг: 0 / 0
XML UTF-8 --> XML Cp1251 Как перекодировать? Экспорт Excel в базу через XML.
    #33203273
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что за класс UploadBean, его исходники ты можешь посмотреть, откуда массив байтов то берется, может можно где нибудь указать кодировку правильную....
...
Рейтинг: 0 / 0
XML UTF-8 --> XML Cp1251 Как перекодировать? Экспорт Excel в базу через XML.
    #33204297
Alexey Turn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем раскопал я это дело, но так ничего и не работает.

Как уже и говорил - использую commons-fileupload.

Вод собственно кусок кода парсинга реквеста:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
 public  List /* FileItem */ parseRequest(HttpServletRequest req)
         throws  FileUploadException
    {
         if  ( null  == req)
        {
             throw   new  NullPointerException("req parameter");
        }

        ArrayList items =  new  ArrayList();
        String contentType = req.getHeader(CONTENT_TYPE);

         if  (( null  == contentType) || (!contentType.startsWith(MULTIPART)))
        {
             throw   new  InvalidContentTypeException(
                "the request doesn't contain a "
                + MULTIPART_FORM_DATA
                + " or "
                + MULTIPART_MIXED
                + " stream, content type header is "
                + contentType);
        }
        int requestSize = req.getContentLength();

        if (requestSize == -1)
        {
            throw new UnknownSizeException(
                "the request was rejected because it's size is unknown");
        }

         if  (sizeMax >=  0  && requestSize > sizeMax)
        {
             throw   new  SizeLimitExceededException(
                "the request was rejected because "
                + "it's size exceeds allowed range");
        }

         try 
        {
             int  boundaryIndex = contentType.indexOf("boundary=");
             if  (boundaryIndex <  0 )
            {
                 throw   new  FileUploadException(
                        "the request was rejected because "
                        + "no multipart boundary was found");
            }
             byte [] boundary = contentType.substring(
                    boundaryIndex +  9 ).getBytes();

            InputStream input = req.getInputStream();

            MultipartStream multi =  [b]new  MultipartStream(input, boundary);
            multi.setHeaderEncoding(headerEncoding);[/b]
             boolean  nextPart = multi.skipPreamble();
             while  (nextPart)
            {
                Map headers = parseHeaders(multi.readHeaders());
                String fieldName = getFieldName(headers);
                 if  (fieldName !=  null )
                {
                    String subContentType = getHeader(headers, CONTENT_TYPE);
                     if  (subContentType !=  null  && subContentType
                                                .startsWith(MULTIPART_MIXED))
                    {
                        // Multiple files.
                         byte [] subBoundary =
                            subContentType.substring(
                                subContentType
                                .indexOf("boundary=") +  9 ).getBytes();
                        multi.setBoundary(subBoundary);
                         boolean  nextSubPart = multi.skipPreamble();
                         while  (nextSubPart)
                        {
                            headers = parseHeaders(multi.readHeaders());
                             if  (getFileName(headers) !=  null )
                            {
                                FileItem item =
                                        createItem(headers, false);
                                OutputStream os = item.getOutputStream();
                                 try 
                                {
                                    multi.readBodyData(os);
                                }
                                 finally 
                                {
                                    os.close();
                                }
                                items.add(item);
                            }
                             else 
                            {
                                // Ignore anything but files inside
                                // multipart/mixed.
                                multi.discardBodyData();
                            }
                            nextSubPart = multi.readBoundary();
                        }
                        multi.setBoundary(boundary);
                    }
                     else 
                    {
                         if  (getFileName(headers) !=  null )
                        {
                            // A single file.
                            FileItem item = createItem(headers, false);
                            OutputStream os = item.getOutputStream();
                             try 
                            {
                                multi.readBodyData(os);
                            }
                             finally 
                            {
                                os.close();
                            }
                            items.add(item);
                        }
                         else 
                        {
                            // A form field.
                            FileItem item = createItem(headers, true);
                            OutputStream os = item.getOutputStream();
                             try 
                            {
                                multi.readBodyData(os);
                            }
                             finally 
                            {
                                os.close();
                            }
                            items.add(item);
                        }
                    }
                }
                 else 
                {
                    // Skip this part.
                    multi.discardBodyData();
                }
                nextPart = multi.readBoundary();
            }
        }
         catch  (IOException e)
        {
             throw   new  FileUploadException(
                "Processing of " + MULTIPART_FORM_DATA
                    + " request failed. " + e.getMessage());
        }

         return  items;
    }

Вот то, что делает Spring:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
 public  MultipartHttpServletRequest resolveMultipart(HttpServletRequest request)  throws  MultipartException {
		DiskFileUpload fileUpload =  this .fileUpload;
		String enc = determineEncoding(request);

		// use prototype FileUpload instance if the request specifies
		// its own encoding that does not match the default encoding
		 if  (!enc.equals( this .defaultEncoding)) {
			fileUpload =  new  DiskFileUpload();
			fileUpload.setSizeMax( this .fileUpload.getSizeMax());
			fileUpload.setSizeThreshold( this .fileUpload.getSizeThreshold());
			fileUpload.setRepositoryPath( this .fileUpload.getRepositoryPath());
			fileUpload.setHeaderEncoding(enc);
		}

		 try  {
			List fileItems = fileUpload.parseRequest(request);
			Map parameters =  new  HashMap();
			Map multipartFiles =  new  HashMap();
			 for  (Iterator it = fileItems.iterator(); it.hasNext();) {
				FileItem fileItem = (FileItem) it.next();
				 if  (fileItem.isFormField()) {
					String value =  null ;
					 try  {
						value = fileItem.getString(enc);
					}
					 catch  (UnsupportedEncodingException ex) {
						logger.warn("Could not decode multipart item '" + fileItem.getFieldName() +
						    "' with encoding '" + enc + "': using platform default");
						value = fileItem.getString();
					}
					String[] curParam = (String[]) parameters.get(fileItem.getFieldName());
					 if  (curParam ==  null ) {
						// simple form field
						parameters.put(fileItem.getFieldName(),  new  String[] { value });
					}
					 else  {
						// array of simple form fields
						String[] newParam = StringUtils.addStringToArray(curParam, value);
						parameters.put(fileItem.getFieldName(), newParam);
					}
				}
				 else  {
					// multipart file field
					CommonsMultipartFile file =  new  CommonsMultipartFile(fileItem);
					multipartFiles.put(file.getName(), file);
					 if  (logger.isDebugEnabled()) {
						logger.debug("Found multipart file [" + file.getName() + "] of size " + file.getSize() +
						    " bytes with original filename [" + file.getOriginalFilename() + "], stored " +
						    file.getStorageDescription());
					}
				}
			}
			 return   new  DefaultMultipartHttpServletRequest(request, multipartFiles, parameters);
		}
		 catch  (FileUploadBase.SizeLimitExceededException ex) {
			 throw   new  MaxUploadSizeExceededException( this .fileUpload.getSizeMax(), ex);
		}
		 catch  (FileUploadException ex) {
			 throw   new  MultipartException("Could not parse multipart request", ex);
		}
	}

Вобщем byte[] далее получается из FileItem - сов отпарсиных из request.

Ставлю в конфиге кодировку UTF-8.

т.е в коде:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
DiskFileUpload fileUpload =  this .fileUpload;
		String enc = determineEncoding(request);

		// use prototype FileUpload instance if the request specifies
		// its own encoding that does not match the default encoding
		 if  (!enc.equals( this .defaultEncoding)) {
			fileUpload =  new  DiskFileUpload();
			fileUpload.setSizeMax( this .fileUpload.getSizeMax());
			fileUpload.setSizeThreshold( this .fileUpload.getSizeThreshold());
			fileUpload.setRepositoryPath( this .fileUpload.getRepositoryPath());
			fileUpload.setHeaderEncoding(enc);
		}

Вот в этом месте:

fileUpload.setHeaderEncoding(enc);

Ставится кодировка UTF-8

Но это нифига не помогает и далее все происходит по старому сценарию.

Подскажите, может можно как-нибуть просто перекодировать insert запросы в правильную кодировку.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / XML UTF-8 --> XML Cp1251 Как перекодировать? Экспорт Excel в базу через XML.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]