Nie ogarniam funkcji Utf8ToAnsi

0

Witam,
Pobieram sobie pewne stronki (pliki html) do zmiennej s:string w celu dalszego przetwarzania.
Niektóre z nich rozpoczynają się sekwencją '', czyli EFBBBF szesnastkowo, co podobno jednoznacznie określa kodowanie UTF-8. Także mają ustawione "charset=UTF-8".

Robię więc tak:

var
  s1,s2:string;
//...
//s1 - zawartość pobranego pliku html
  if Copy(s1,1,3)='' then
    s2:=Utf8ToAnsi(s1);//w wyniku otrzymuję s2=''
//a także
  if Copy(s1,1,3)='' then
    s2:=Utf8ToAnsi(Copy(s1,4,MaxInt));//w wyniku również otrzymuję s2=''

Jak właściwie działa funkcja Utf8ToAnsi i jak należy należy prawidłowo ją stosować?

0

Te literki na początku pliku to tzw. BOM http://pl.wikipedia.org/wiki/BOM

Pod adresem https://forums.embarcadero.com/thread.jspa?threadID=48646 znalazłem Creating UTF-8 file without BOM ale nie testowałem, więc nie wiem czy to działa

0

A co pokaże ci ten kod?

var
  ID: LangID;
  LanguageName: array[0..255] of Char;
begin
  ID := GetSystemDefaultLangID;
  VerLanguageName(ID, LanguageName, SizeOf(LanguageName));
  ShowMessage(LanguageName);
end;
0

@Aldonix
Artykuł, który podałeś, dotyczy zagadnienia "Creating UTF-8 file without BOM".
Mi chodzi raczej o coś odwrotnego - odczyt pliku kodowanego UTF-8, posiadającego BOM bo taki plik ściągam i nie mam wpływu na jego kodowanie.

0

Wklejam przykładowy plik bo nie potrafię dołączyć go jako załącznika.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="refresh" content="600">
<meta name="robots" content="noindex,nofollow">
<meta name="author" content="meteoalarm Development Team">
<title>Meteoalarm - severe weather warnings for Europe - Mainpage</title>
<meta name="title" content="Meteoalarm - severe weather warnings for Europe - Mainpage"><meta name="description" content="Meteoalarm, a web-based service to warn people travelling in Europe of severe weather. Meteoalarm provides up-to-the minute severe weather warnings for 30 European countries. The information is supplied by Europe&#039;s leading national weather services, and covers the most popular business and tourist destinations. The web site uses recognisable, universal images to avoid any potential language barriers and is clear and easy to use. It uses a traffic light system on a geographical map of Europe to indicate where severe weather is expected. A range of potential weather and environmental elements are covered including heavy rain, strong wind, high and low temperatures, snow and ice, and avalanches."><META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE"><link rel="alternate" type="application/rss+xml" title="warnings-Europa"  href="/documents/rss/europa.rss"><link rel="alternate" type="application/rss+xml" title="warnings-Polska"  href="/documents/rss/pl.rss"><link rel="alternate" type="application/rss+xml" title="warnings-Małopolskie"  href="/documents/rss/pl/PL008.rss"><link rel="stylesheet" type="text/css" title="default" href="/css/style1.css.php">
<link type="image/x-icon" href="/favicon.ico" rel="icon">
<link rel="stylesheet" type="text/css" title="default" href="/css/countrys.css">
<link rel="stylesheet" type="text/css" title="default" href="/css/warnings.css">
<script type="text/javascript" src="/lib/lib_head.js"></script>
<script type="text/javascript" src="/includes/scriptaculous/lib/prototype.js"></script>
<script type="text/javascript" src="/includes/scriptaculous/src/scriptaculous.js"></script>
<script type="text/javascript" src="/js/content.js"></script>
</head>
<body><div id="container">
            <div id="header">
                <span class="left-colum"></span>
                <span class="right-colum"></span>
            </div><div id="navigation">
                <span class="left-colum"><a href="/?lang=po_PL">Start</a> | <a href="/news.php?lang=po_PL">Wiadomosci</a> | <a href="/about.php?lang=po_PL">Meteoalarm</a> | <a href="/help.php?lang=po_PL">Pomoc</a> | <a href="/terms.php?lang=po_PL">Warunki</a> | <a href="/links.php?lang=po_PL">Linki</a> | <a href="javascript:opennewFrame('frame', '/displaysettings.inc.php?lang=po_PL', 300, 245, 'close')">Display Options</a></span>
                <span class="right-colum"><form method="GET" action="/index3.php" name="form_lang" id="form_lang">&nbsp;&nbsp;<a href="/user/fiche.php?id=0"></a>&nbsp;&nbsp;<select class="flat" name="lang" onChange="submit()"><option value="en_UK">english</option><option value="ca_ES">catalĂ </option><option value="ce_CZ">ÄŤeština</option><option value="da_DK">dansk</option><option value="de_GE">deutsch</option><option value="es_ES">español</option><option value="ee_EE">eesti</option><option value="eu_VA">euskera</option><option value="fr_FR">français</option><option value="ga_ES">galego</option><option value="hr_HR">hrvatski</option><option value="is_IS">Ă­slenska</option><option value="it_IT">italiano</option><option value="li_LT">lietuviu</option><option value="la_LV">latviešu</option><option value="ma_HU">magyar</option><option value="ma_MT">malti</option><option value="ne_NL">nederlands</option><option value="no_NO">norsk</option><option value="po_PL" selected="true">polski</option><option value="po_PT">portuguĂŞs</option><option value="ro_RO">româna</option><option value="cp_RS">ŃрпŃки</option><option value="sl_SI">slovenščina</option><option value="sl_SK">slovenÄŤina</option><option value="su_FI">suomi</option><option value="sv_SE">svenska</option><option value="gr_GR">Ελληνικά</option><option value="mk_MK">FYRO Macedonian</option></select><input type='hidden' name='area' value='PL008'><input type='hidden' name='day' value='0'></form>
                </span></div><div id="position" ><div class="left-colum">&raquo; <a href="index.php?lang=po_PL">Europa</a> &raquo; <a href="index2.php?lang=po_PL&country=PL&day=0">Polska</a> &raquo <a>Małopolskie:</a></div></div>
<div id="content">
                <table class="contable" border="0" cellpadding="0" cellspacing="0">
                    <tr>
                         <td class="infobox" style="height:0px;"  height="0" colspan="3"><h1>Ostrzezenia pogodowe: Małopolskie&nbsp;<a style="right:13px; position:absolute;" href="/documents/rss/pl/PL008.rss"><img src="/theme/style1/img/object_rss.png" border="0" alt="Show RSS version" title="Show RSS version"> </a></h1></td></tr><tr><td rowspan="3" width="100% " style="padding-bottom:30px;"><div class="warnbox wb1">
                        <img src="/theme/common/pictures/aw000.jpg">
                        <div class="info"><br></div>
                        <div class="info"><br></div>
                        <div class="info"><br></div>
                        <div class="info"><br></div>
                        <div class="info"><br></div>
                        <div class="info" style="text-align:center; font-weight:bold;">Brak ostrzezen</div>

                            </div>                  <div class="warn-nav"                   <form method="GET" name="warn-nav" action="">
                                <script>
                                    function WM(day){
                                    if(day == "") day = 0;
                                    document.location.href = "index3.php?area=PL008&lang=po_PL&day="+day;
                                    }
                                </script>

                                <input type="hidden" name="lang" value="po_PL">
                                <span class="right-colum">
                                <input id="day" name="day" type="hidden" value="0">
                                Wyswietl::&nbsp;&nbsp;<input name="day" class="day active" type="button" value="dzis" onclick="WM(0)"> <input name="day" class="day " type="button" value="jutro" onclick="WM(1)">
                                </span>
                                </form>
                            </div>
                        </td>
                        <td rowspan="3" width="12">&nbsp;&nbsp;
                        </td>

                    </tr>
                    <tr>
                    <td class="flags" valign="top" width="100%" style="padding-left:8px;padding-reight:10px;">
                                        <a href="index.php?lang=po_PL&day=0">
                                            <p> Europa:</p>
                                            <img src="map.php?iso=euro&data=0&type=0&tiny=1" border="0"> 
                                        </a>
                                    <br>
                                        <a href="index2.php?lang=po_PL&country=PL&day=0">
                                            <p> Polska:</p>
                                            <img src="map.php?iso=PL&data=0&tiny=1" border="0">
                                        </a>
                                <br>

                    <a href="http://www.pogodynka.pl/polska/ostrzezenia" target="_blank">
                    <p>wiecej informacji</p>
                    <img src="/documents/societe/logos//29/Pogodynka_logo.png" border="0" alt="Biuro Prognoz Meteorologicznych w Krakowie" name="Biuro Prognoz Meteorologicznych w Krakowie">
                    </a>
                                </td>
                    </tr>
                    <tr>
                        <td class="td-warn-nav" >

                    </td>
                        <td>            
                        </td>
                    </tr>
                </table>

    <script> if(WertHolen() != getWindowWidth()) WertSetzen('windowWidth', getWindowWidth(), 1000*60*60*24*30) </script>        

        </div>

        <div id="languages">
            <span class="right-colum">
                Zmien jezyk:&nbsp;&nbsp;| <a href="/index3.php?lang=ce_CZ&area=PL008&day=0">CZ</a> | <a href="/index3.php?lang=da_DK&area=PL008&day=0">DA</a> | <a href="/index3.php?lang=de_GE&area=PL008&day=0">DE</a> | <a href="/index3.php?lang=ee_EE&area=PL008&day=0">EE</a> | <a href="/index3.php?lang=en_UK&area=PL008&day=0">EN</a> | <a href="/index3.php?lang=ca_ES&area=PL008&day=0">ES</a> | <a href="/index3.php?lang=es_ES&area=PL008&day=0">ES</a> | <a href="/index3.php?lang=ga_ES&area=PL008&day=0">ES</a> | <a href="/index3.php?lang=su_FI&area=PL008&day=0">FI</a> | <a href="/index3.php?lang=fr_FR&area=PL008&day=0">FR</a> | <a href="/index3.php?lang=gr_GR&area=PL008&day=0">GR</a> | <a href="/index3.php?lang=hr_HR&area=PL008&day=0">HR</a> | <a href="/index3.php?lang=ma_HU&area=PL008&day=0">HU</a> | <a href="/index3.php?lang=is_IS&area=PL008&day=0">IS</a> | <a href="/index3.php?lang=it_IT&area=PL008&day=0">IT</a> | <a href="/index3.php?lang=li_LT&area=PL008&day=0">LT</a> | <a href="/index3.php?lang=la_LV&area=PL008&day=0">LV</a> | <a href="/index3.php?lang=mk_MK&area=PL008&day=0">MK</a> | <a href="/index3.php?lang=ma_MT&area=PL008&day=0">MT</a> | <a href="/index3.php?lang=ne_NL&area=PL008&day=0">NL</a> | <a href="/index3.php?lang=no_NO&area=PL008&day=0">NO</a> | <a href="/index3.php?lang=po_PL&area=PL008&day=0">PL</a> | <a href="/index3.php?lang=po_PT&area=PL008&day=0">PT</a> | <a href="/index3.php?lang=ro_RO&area=PL008&day=0">RO</a> | <a href="/index3.php?lang=cp_RS&area=PL008&day=0">RS</a> | <a href="/index3.php?lang=sl_SI&area=PL008&day=0">SI</a> | <a href="/index3.php?lang=sl_SK&area=PL008&day=0">SK</a> | <a href="/index3.php?lang=sv_SE&area=PL008&day=0">SV</a> | <a href="/index3.php?lang=eu_VA&area=PL008&day=0">VA</a></div>
            </span>

        </div><script type="text/javascript" src="/lib/lib_foot.js"></script>

<!-- $Date: 2009/08/12 18:25:53 $ - $Revision: 1.0 $ -->
</body>
</html>
<!--
***************************************************************************
 meteoalarm

 technical project concept & design & realization by backbone internet service GmbH (Austria)
 http://www.backbone.co.at

 ©copyright 2009 by backbone internet service GmbH
 http://www.backbone.co.at

 all Rights reserved
 Version 2.0 
***************************************************************************
-->
0

U mnie działa bez problemu:

  if Copy(S,1,3)='' then
  begin
    Delete(S,1,3);
    S:=UTF8ToWideString(S);
    ShowMessage(S);
  end;
0

Dzięki _13th_Dragon za poświęcenie czasu i sugestie ale nie chcę używać Jedi dla rozwiązania pojedynczego problemu. :)

Chyba sobie w końcu poradziłem.
Otóż gdzieś znalazłem taką informację:

UTF8ToAnsi (...) A Null is returned when using an invalid code page.

Poszedłem tym tropem i w unicie WideStrUtils (standardowe wyposażenie Delphi7) znalazłem funkcję

function Utf8ToAnsiEx(const S: UTF8String; const cp : integer): string;

W unicie Windows znalazłem deklaracje stron kodowych.
Funkcję należy wywołać następująco:

  s2:=Utf8ToAnsiEx(s1,CP_ACP);

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0