Вопрос или проблема
Я пытаюсь использовать curl(v8.6.0), чтобы отправить http-запрос на сервер под терминалом Windows Git Bash. Серверная сторона была приложением Java Spring Boot, когда содержимое JSON в curl содержит китайские слова, серверная сторона выдает ошибку:
Причина: com.fasterxml.jackson.databind.JsonMappingException: Неверный начальный байт UTF-8 0xb2
в [Источник: (org.springframework.util.StreamUtils$NonClosingInputStream); строка: 1, столбец: 11] (через цепочку ссылок: com.guangdanet.youxue.admin.rest.vo.product.line.LineSaveReqVO["name"])
в com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:402)
в com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:361)
в com.fasterxml.jackson.databind.deser.BeanDeserializerBase.wrapAndThrow(BeanDeserializerBase.java:1863)
в com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:394)
в com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:185)
в com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)
в com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2105)
в com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481)
в org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395)
... 175 общих кадров пропущены
Причина: com.fasterxml.jackson.core.JsonParseException: Неверный начальный байт UTF-8 0xb2
в [Источник: (org.springframework.util.StreamUtils$NonClosingInputStream); строка: 1, столбец: 11]
в com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:2477)
в com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:750)
в com.fasterxml.jackson.core.json.UTF8StreamJsonParser._reportInvalidInitial(UTF8StreamJsonParser.java:3712)
в com.fasterxml.jackson.core.json.UTF8StreamJsonParser._reportInvalidChar(UTF8StreamJsonParser.java:3708)
в com.fasterxml.jackson.core.json.UTF8StreamJsonParser._finishString2(UTF8StreamJsonParser.java:2634)
в com.fasterxml.jackson.core.json.UTF8StreamJsonParser._finishAndReturnString(UTF8StreamJsonParser.java:2560)
в com.fasterxml.jackson.core.json.UTF8StreamJsonParser.getText(UTF8StreamJsonParser.java:335)
в com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:42)
в com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)
в com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)
в com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:392)
Jackson является стандартным парсером JSON для приложения Spring Boot. Эта серверная сторона работает нормально с запросом XHR в Google Chrome, но не удается с запросом curl из терминала Windows Git. Я не понимаю, что я пропустил? Похоже, у этого Git Bash есть проблемы с кодировкой в Windows. Что мне делать, чтобы сделать так, чтобы Windows Git Bash поддерживал китайские слова? Вот информация о curl:
curl 8.6.0(x86_64-w64-mingw32) 1ibcur1/8.6.0 schannel z1ib/1.3.1 brotli/1.1.0std/1.5.5 1ibidn2/2.3.7 1ibps1/0.21.5 1ibssh2/1.11.0Дата релиза: 2024-01-31Протоколы: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns lda2 ldaps mgtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftpeatures: alt-svc AsynchDNs brotli HSTS HTTPS-прокси IDN IPv6 Kerberos Largefileibz NTLM PSL SPNEGO SSL SSPI потокобезопасный UnixSockets zstd
Ответ или решение
Да, возможно настроить Git Bash на Windows для поддержки китайских символов, что позволит избежать проблем с кодировкой при отправке JSON-данных с использованием curl
. Ошибка, с которой вы столкнулись, указывает на проблемы с кодировкой UTF-8. Вот шаги, которые помогут вам решить эту проблему:
1. Убедитесь, что файлы сохраняются в кодировке UTF-8
Первый и самый важный шаг — это убедиться, что ваши JSON-файлы или строки сохраняются в кодировке UTF-8. Если вы используете текстовый редактор, проверьте, чтобы он поддерживал и сохранял файлы в кодировке UTF-8. Например, в редакторах как Notepad++, Visual Studio Code и других вы можете выбрать кодировку в меню "Файл" -> "Сохранить как" или "Кодировка".
2. Установка локали в Git Bash
Git Bash на Windows может не поддерживать кодировку UTF-8 по умолчанию. Чтобы это изменить, вы можете установить переменную окружения LANG
:
- Откройте Git Bash.
-
Введите следующую команду, чтобы установить локаль в UTF-8:
export LANG=zh_CN.UTF-8
Это должно помочь Bash понимать и обрабатывать китайские символы.
3. Проверка настройки curl
При использовании curl
важно убедиться, что вы передаете данные в правильной кодировке. Запустите curl
с указанием, что кодировка UTF-8
, используя заголовок Content-Type
:
curl -X POST -H "Content-Type: application/json; charset=utf-8" -d '{"name": "中文测试"}' http://example.com/api
Здесь вы должны заменить http://example.com/api
на ваш фактический URL и строку JSON на необходимую.
4. Переключение на другую терминальную утилиту
Если вышеуказанные шаги не работают, вы можете рассмотреть возможность использования другой терминальной утилиты, такой как Windows Terminal или ConEmu, которые могут иметь лучшие настройки кодировки по умолчанию для работы с символами UTF-8.
5. Проверка системных настроек
Убедитесь, что настройки вашей операционной системы Windows поддерживают UTF-8. В Windows 10 и новее, вы можете включить поддержку UTF-8 для приложений, изменив системные параметры в "Панели управления":
- Откройте "Панель управления".
- Перейдите в "Часы и регион".
- Выберите "Регион" и затем "Дополнительные настройки".
- Перейдите на вкладку "Управление" и установите галочку на "Использовать объединенную локаль UTF-8 для языков, требующих байтового порядка".
Заключение
Следуя данным шагам, вы должны быть в состоянии правильно обрабатывать китайские символы при использовании curl
из Git Bash на Windows. Если у вас все равно возникают проблемы, рассмотрите возможность использования другого инструмента для работы с HTTP-запросами, такого как Postman, который более дружелюбен с кодировкой и обеспечит более удобный интерфейс для тестирования API.