1 /* 2 * This file is part of KDiff3. 3 * 4 * SPDX-FileCopyrightText: 2002-2011 Joachim Eibl, joachim.eibl at gmx.de 5 * SPDX-FileCopyrightText: 2018-2020 Michael Reeves reeves.87@gmail.com 6 * SPDX-License-Identifier: GPL-2.0-or-later 7 */ 8 9 #include <QTextCodec> 10 11 // UTF8-Codec that saves a BOM 12 class UTF8BOMCodec: public QTextCodec 13 { 14 QTextCodec* m_pUtf8Codec; 15 class PublicTextCodec: public QTextCodec 16 { 17 public: publicConvertToUnicode(const char * p,int len,ConverterState * pState)18 QString publicConvertToUnicode(const char* p, int len, ConverterState* pState) const 19 { 20 return convertToUnicode(p, len, pState); 21 } publicConvertFromUnicode(const QChar * input,int number,ConverterState * pState)22 QByteArray publicConvertFromUnicode(const QChar* input, int number, ConverterState* pState) const 23 { 24 return convertFromUnicode(input, number, pState); 25 } 26 }; 27 28 public: UTF8BOMCodec()29 UTF8BOMCodec() 30 { 31 m_pUtf8Codec = QTextCodec::codecForName("UTF-8"); 32 } name()33 QByteArray name() const override { return "UTF-8-BOM"; } mibEnum()34 int mibEnum() const override { return 2123; } 35 convertFromUnicode(const QChar * input,int number,ConverterState * pState)36 QByteArray convertFromUnicode(const QChar* input, int number, ConverterState* pState) const override 37 { 38 QByteArray r; 39 if(pState && pState->state_data[2] == 0) // state_data[2] not used by QUtf8::convertFromUnicode (see qutfcodec.cpp) 40 { 41 r += "\xEF\xBB\xBF"; 42 pState->state_data[2] = 1; 43 pState->flags |= QTextCodec::IgnoreHeader; 44 } 45 46 r += ((PublicTextCodec*)m_pUtf8Codec)->publicConvertFromUnicode(input, number, pState); 47 return r; 48 } 49 convertToUnicode(const char * p,int len,ConverterState * pState)50 QString convertToUnicode(const char* p, int len, ConverterState* pState) const override 51 { 52 return ((PublicTextCodec*)m_pUtf8Codec)->publicConvertToUnicode(p, len, pState); 53 } 54 }; 55