2013-04-29 6 views
2

Как заменить пустые символы вставки из строки?Преобразование WideString в String

например: «Н е л л о» преобразовать «Hello»

Я прочитал поле блоб текст из БД, и хотите сохранить его в другой таблице. Когда я его читаю, я получаю лишние пробелы, когда храню лишние пробелы, и не может быть правильно прочитан при следующем запросе.

DXE, Firebird 2,5

UPDATE:
Я использую IBQuery -> DataSetProvider -> ClientDataSet без Desin времени создаваемых полей. Это швы, что IBQuery извлекает данные в неправильном формате.

Текущий Написать код:

blobStream := TStringStream.Create; 
... 
blobStream.WriteString(blobText); //blobText = 'H e l l o'; 
ibsql.ParamByName('ABLOBCOL').LoadFromStream(blobStream); 
... 
ibsql.ExecQuery; 
... 

В базе FB является «Н е л л о» хранится, но оно должно быть «Привет». Поскольку это похоже на ошибку в IBQuery, мне нужен способ конвертировать эту строку.

+4

Вы задали неправильный вопрос. Вы не хотите удалять пробелы. Вы хотите правильно интерпретировать данные в первую очередь. Можете ли вы показать код, который создал строку. –

+0

Обновлен вопрос. –

ответ

7

Прежде всего, я не буду пытаться описать, как удалить все остальные символы из строки. Хотя это, возможно, решит вашу проблему, оно просто плохо обрабатывает щелевые трещины. То, что у вас здесь, - это классическое несоответствие кодировки текста. Реальное решение вашей проблемы будет связано с устранением несоответствия.

Я подозреваю, что проблема возникает в коде, который вы еще не указали. Насколько я понимаю ваш вопрос сейчас, у вас есть переменная stringblobText, которая содержит неправильно закодированный текст. Но код в вопросе принимает blobText в качестве входных данных, и поэтому ущерб уже был сделан к моменту достижения кода в вопросе. Ключом к решению этого является код, который помещает данные Duff в blobText.

Вам необходимо найти код, который присваивает blobText и устранить проблему с кодировкой. Похоже, вы взяли кодированный текст UTF-16 и интерпретировали его так, как будто он имел 8-битную кодировку. Я мог бы рассказать о том, как это произойдет, но вам было бы лучше посмотреть на фактический код, код, который присваивает blobText. Если вы не можете решить эту проблему, отправьте сообщение на вопрос.

Я уверен, что в библиотеках баз данных нет ошибок, и это просто несоответствие кодировки.

+0

Это не помогло. Пока я просто изменил код TIBQuery и включил его в свой проект. Когда поля создаются, я всегда возвращаю ftWideMemo вместо ftMemo. Не уверен, что эта ошибка уже исправлена ​​выше Delphi XE? –

+0

Ну, я до сих пор не знаю, какую версию Delphi вы используете, и что вы сделали «не помогло». Я сомневаюсь, что есть ошибка, кроме вашего кода. –

+0

Как упоминалось в моем вопросе, я использую DXE и Firebird 2.5. Тексты blob в firbird 2.x всегда обрабатываются как DataType ftMemo, когда используется компонент IBQuery. Затем TClientDataSet с его DataSetProvider загружает определения полей из IBQuery и преобразует ftMemo DataType в TMemoField. Что приводит к проблеме descib выше. Когда CDS использует TWideMemoField, тогда значения верны (без пробелов «H e l l o»). –

Смежные вопросы