I know this has already been answered, but I have encountered the same issue and fix it by fixing the charset in table for future input data.
I am using SQL Server 2017 and Collation is set to SQL_Latin1_General_CP1_CI_AS
For existing characters I have written a script to pull the data from db and search each characters that match and fix those characters.
I have created two csv one contains the data with stray characters(email_templates.csv") and other contains clean html templates(clean_templates.csv).
To find the stray characters in your text/html you can use this online tool as well this is very helpful.
https://freetools.textmagic.com/unicode-detector
UTF-8 Encoding Debugging Chart
https://www.i18nqa.com/debug/utf8-debug.html
HTML codes and HTML special characters
https://psdtowp.net/html-codes-special-characters.html
To verify the same in VS Code I have used extension Render Special Characters below is the link.
https://marketplace.visualstudio.com/items?itemName=miku3920.vscode-render-special-chars
PHP Script to verify and Fix the issue
$fileName = "email_templates.csv";
$ofileName = "clean_templates.csv";
try {
    $stray_chars = array(
        '—' => '-',
        '–' => '-',
        '‘'=> '\'',
        '’' => '\'',
        '“' => '"' ,
        'â€' => '"',
        'Â'=>'',
        'ó'=> "ó",
        "ñ" => "ñ",
        "Ã" => "í",
        "á"=> "á",
        "" => '',
    );
    
    $contents = getEmailTemplateContent();
    $handle = fopen($fileName, "w") or die('Unable to open file');
    $ohandle = fopen($ofileName, "w") or die('Unable to open file');
    $data = [];
    $cleaned = [];
    $i = 0;
    $html = '';
    foreach($contents as $content) {
        $html = $content['html'];
        $clean = str_replace(array_keys($stray_chars), array_values($stray_chars), $html);
        $cleaned[$i] = $content['id']."-xxxx-".$clean;
        $data[$i] = $content['id']."-xxxx-".$html;
        //Fix stray characters in database
        updateEmailTemplateContent($clean, $content['id']);
        $i++;
    }
    fputcsv($handle, $data);
    fputcsv($ohandle, $cleaned);
    fclose($handle);
    fclose($ohandle);
}
catch(\PDOException $e) {
    $jobStatus = 'E';
    $jobError = $e->getMessage();
}