You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
182 lines
6.0 KiB
182 lines
6.0 KiB
/* |
|
* This file is a part of PikoTools |
|
* and is distributed under the (new) BSD licence. |
|
* Author: Tomasz Sowa <t.sowa@ttmath.org> |
|
*/ |
|
|
|
/* |
|
* Copyright (c) 2010-2021, Tomasz Sowa |
|
* All rights reserved. |
|
* |
|
* Redistribution and use in source and binary forms, with or without |
|
* modification, are permitted provided that the following conditions are met: |
|
* |
|
* * Redistributions of source code must retain the above copyright notice, |
|
* this list of conditions and the following disclaimer. |
|
* |
|
* * Redistributions in binary form must reproduce the above copyright |
|
* notice, this list of conditions and the following disclaimer in the |
|
* documentation and/or other materials provided with the distribution. |
|
* |
|
* * Neither the name Tomasz Sowa nor the names of contributors to this |
|
* project may be used to endorse or promote products derived |
|
* from this software without specific prior written permission. |
|
* |
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
|
* THE POSSIBILITY OF SUCH DAMAGE. |
|
*/ |
|
|
|
#ifndef headerfile_picotools_utf8_utf8 |
|
#define headerfile_picotools_utf8_utf8 |
|
|
|
#include <string> |
|
#include "textstream/textstream.h" |
|
|
|
|
|
namespace pt |
|
{ |
|
|
|
/*! |
|
UTF-8, a transformation format of ISO 10646 |
|
http://tools.ietf.org/html/rfc3629 |
|
|
|
when wchar_t is 4 bytes length we use UTF-32 |
|
when wchar_t is 2 bytes length we use UTF-16 (with surrogate pairs) |
|
|
|
UTF-16 |
|
http://www.ietf.org/rfc/rfc2781.txt |
|
*/ |
|
|
|
|
|
|
|
/*! |
|
returns true if 'c' is a correct unicode character |
|
*/ |
|
bool UTF8_CheckRange(int c); |
|
|
|
|
|
/*! |
|
returns true if 'c' is a correct unicode character |
|
|
|
this method is used when reading from an utf8 string |
|
how_many_chars - means how many characters from utf8 string were read |
|
*/ |
|
bool UTF8_CheckRange(int c, int how_many_bytes); |
|
|
|
|
|
/* |
|
* |
|
* |
|
* |
|
* convertions from UTF-8 |
|
* |
|
* |
|
* |
|
*/ |
|
|
|
/*! |
|
converting one character from UTF-8 to an int |
|
*/ |
|
size_t UTF8ToInt(const char * utf8, size_t utf8_len, int & res, bool & correct); |
|
size_t UTF8ToInt(const char * utf8, int & res, bool & correct); |
|
size_t UTF8ToInt(const std::string & utf8, int & res, bool & correct); |
|
size_t UTF8ToInt(std::istream & utf8, int & res, bool & correct); |
|
|
|
|
|
/*! |
|
converting UTF-8 string to a wide string |
|
*/ |
|
bool UTF8ToWide(const char * utf8, size_t utf8_len, std::wstring & res, bool clear = true, int mode = 1); |
|
bool UTF8ToWide(const char * utf8, std::wstring & res, bool clear = true, int mode = 1); |
|
bool UTF8ToWide(const std::string & utf8, std::wstring & res, bool clear = true, int mode = 1); |
|
bool UTF8ToWide(std::istream & utf8, std::wstring & res, bool clear = true, int mode = 1); |
|
|
|
template<typename StreamType> |
|
bool UTF8ToWide(const char * utf8, size_t utf8_len, StreamType & res, bool clear = true, int mode = 1); // need to be tested |
|
|
|
template<typename StreamType> |
|
bool UTF8ToWide(const char * utf8, StreamType & res, bool clear = true, int mode = 1); // need to be tested |
|
|
|
template<typename StreamType> |
|
bool UTF8ToWide(const std::string & utf8, StreamType & res, bool clear = true, int mode = 1); // need to be tested |
|
|
|
template<typename StreamType> |
|
bool UTF8ToWide(std::istream & utf8, StreamType & res, bool clear = true, int mode = 1); // need to be tested |
|
|
|
|
|
|
|
/* |
|
* |
|
* |
|
* |
|
* convertions to UTF-8 |
|
* |
|
* |
|
* |
|
*/ |
|
|
|
|
|
/*! |
|
converting one int character to UTF-8 |
|
*/ |
|
size_t IntToUTF8(int z, char * utf8, size_t utf8_max_len); |
|
size_t IntToUTF8(int z, std::string & utf8, bool clear = true); |
|
|
|
template<typename StreamType> |
|
size_t IntToUTF8(int z, StreamType & utf8); |
|
|
|
|
|
|
|
/*! |
|
converting a wide string to UTF-8 string |
|
*/ |
|
bool WideToUTF8(const wchar_t * wide_string, size_t string_len, std::string & utf8, bool clear = true, int mode = 1); |
|
bool WideToUTF8(const wchar_t * wide_string, std::string & utf8, bool clear = true, int mode = 1); |
|
bool WideToUTF8(const std::wstring & wide_string, std::string & utf8, bool clear = true, int mode = 1); |
|
|
|
template<typename StreamType> |
|
bool WideToUTF8(const wchar_t * wide_string, size_t string_len, StreamType & utf8, int mode = 1); |
|
|
|
template<typename StreamType> |
|
bool WideToUTF8(const wchar_t * wide_string, StreamType & utf8, int mode = 1); |
|
|
|
template<typename StreamType> |
|
bool WideToUTF8(const std::wstring & wide_string, StreamType & utf8, int mode = 1); |
|
|
|
|
|
|
|
bool WideToUTF8(const wchar_t * wide_string, size_t string_len, char * utf8, size_t utf8_len, size_t & utf8_written, int mode = 1); |
|
bool WideToUTF8(const wchar_t * wide_string, char * utf8, size_t utf8_len, size_t & utf8_written, int mode = 1); |
|
bool WideToUTF8(const std::wstring & wide_string, char * utf8, size_t utf8_len, size_t & utf8_written, int mode = 1); |
|
// implement template<typename StreamType> |
|
|
|
bool WideToUTF8(const wchar_t * wide_string, size_t string_len, char * utf8, size_t utf8_len, int mode = 1); |
|
bool WideToUTF8(const wchar_t * wide_string, char * utf8, size_t utf8_len, int mode = 1); |
|
bool WideToUTF8(const std::wstring & wide_string, char * utf8, size_t utf8_len, int mode = 1); |
|
// implement template<typename StreamType> |
|
|
|
template<typename StreamType> |
|
void WideStreamToUTF8(StreamType & buffer, std::string & utf8, bool clear = true, int mode = 1); // not tested |
|
|
|
template<typename StreamTypeIn, typename StreamTypeOut> |
|
void WideStreamToUTF8(StreamTypeIn & buffer, StreamTypeOut & utf8, int mode = 1); // not tested |
|
|
|
|
|
|
|
|
|
} // namespace |
|
|
|
|
|
#include "utf8/utf8_templates.h" |
|
|
|
#endif |
|
|
|
|